this repo has no description
at trunk 114 lines 4.3 kB view raw
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 2#include "Python.h" 3#include "gmock/gmock-matchers.h" 4 5#include "capi-fixture.h" 6#include "capi-testing.h" 7 8namespace py { 9namespace testing { 10 11using UnderWarningsExtensionApiTest = ExtensionApi; 12 13TEST_F(UnderWarningsExtensionApiTest, 14 WarnFormatWithNullCategoryPrintsRuntimeWarning) { 15 CaptureStdStreams streams; 16 EXPECT_EQ(PyErr_WarnFormat(nullptr, 0, "%d", 0), 0); 17 EXPECT_EQ(PyErr_Occurred(), nullptr); 18 EXPECT_THAT(streams.err(), ::testing::EndsWith("RuntimeWarning: 0\n")); 19} 20 21TEST_F(UnderWarningsExtensionApiTest, 22 WarnFormatWithNonTypeCategoryRaisesTypeError) { 23 EXPECT_EQ(PyErr_WarnFormat(Py_True, 0, "blah"), -1); 24 EXPECT_EQ(PyErr_Occurred(), PyExc_TypeError); 25} 26 27TEST_F(UnderWarningsExtensionApiTest, 28 WarnExWithNullCategoryPrintsRuntimeWarning) { 29 CaptureStdStreams streams; 30 EXPECT_EQ(PyErr_WarnEx(nullptr, "bar", 0), 0); 31 EXPECT_EQ(PyErr_Occurred(), nullptr); 32 EXPECT_THAT(streams.err(), ::testing::EndsWith("RuntimeWarning: bar\n")); 33} 34 35TEST_F(UnderWarningsExtensionApiTest, 36 WarnExWithNegativeStackLevelDefaultsToCurrentModule) { 37 CaptureStdStreams streams; 38 EXPECT_EQ(PyErr_WarnEx(PyExc_RuntimeWarning, "bar", -10), 0); 39 EXPECT_EQ(PyErr_Occurred(), nullptr); 40 EXPECT_THAT(streams.err(), 41 ::testing::EndsWith("sys:1: RuntimeWarning: bar\n")); 42} 43 44TEST_F(UnderWarningsExtensionApiTest, 45 WarnExWithStackLevelGreaterThanDepthDefaultsToSys) { 46 CaptureStdStreams streams; 47 // TODO(T43609717): Determine the current stack depth with C-API and ensure 48 // that this is a bigger number. 49 EXPECT_EQ(PyErr_WarnEx(PyExc_RuntimeWarning, "bar", PY_SSIZE_T_MAX - 1), 0); 50 EXPECT_EQ(PyErr_Occurred(), nullptr); 51 EXPECT_THAT(streams.err(), 52 ::testing::EndsWith("sys:1: RuntimeWarning: bar\n")); 53} 54 55TEST_F(UnderWarningsExtensionApiTest, 56 WarnExWithNonTypeCategoryRaisesTypeError) { 57 EXPECT_EQ(PyErr_WarnEx(Py_True, "blah", 0), -1); 58 EXPECT_EQ(PyErr_Occurred(), PyExc_TypeError); 59} 60 61TEST_F(UnderWarningsExtensionApiTest, 62 WarnExplicitObjectWithNoneModuleDoesNothing) { 63 CaptureStdStreams streams; 64 PyObjectPtr message(PyUnicode_FromString("foo")); 65 PyObjectPtr filename(PyUnicode_FromString("bar")); 66 EXPECT_EQ(PyErr_WarnExplicitObject(PyExc_RuntimeWarning, message, filename, 67 /*lineno=*/1, /*module=*/Py_None, 68 /*registry=*/Py_None), 69 0); 70 EXPECT_EQ(PyErr_Occurred(), nullptr); 71 EXPECT_EQ(streams.err(), ""); 72 EXPECT_EQ(streams.out(), ""); 73} 74 75TEST_F(UnderWarningsExtensionApiTest, 76 WarnExplicitObjectWithNullCategoryPrintsRuntimeWarning) { 77 CaptureStdStreams streams; 78 PyObjectPtr message(PyUnicode_FromString("foo")); 79 PyObjectPtr filename(PyUnicode_FromString("bar")); 80 PyObjectPtr module(PyUnicode_FromString("baz")); 81 EXPECT_EQ(PyErr_WarnExplicitObject(/*category=*/nullptr, message, filename, 82 /*lineno=*/1, module, 83 /*registry=*/Py_None), 84 0); 85 EXPECT_EQ(PyErr_Occurred(), nullptr); 86 EXPECT_THAT(streams.err(), 87 ::testing::EndsWith("bar:1: RuntimeWarning: foo\n")); 88} 89 90TEST_F(UnderWarningsExtensionApiTest, 91 WarnExplicitObjectWithNullRegistryPassesNoneRegistry) { 92 CaptureStdStreams streams; 93 PyObjectPtr message(PyUnicode_FromString("foo")); 94 PyObjectPtr filename(PyUnicode_FromString("bar")); 95 PyObjectPtr module(PyUnicode_FromString("baz")); 96 EXPECT_EQ(PyErr_WarnExplicitObject(/*category=*/PyExc_FutureWarning, message, 97 filename, 98 /*lineno=*/1, module, 99 /*registry=*/nullptr), 100 0); 101 EXPECT_EQ(PyErr_Occurred(), nullptr); 102 EXPECT_EQ(PyErr_WarnExplicitObject(/*category=*/PyExc_FutureWarning, message, 103 filename, 104 /*lineno=*/1, module, 105 /*registry=*/nullptr), 106 0); 107 EXPECT_EQ(PyErr_Occurred(), nullptr); 108 EXPECT_THAT(streams.err(), 109 ::testing::EndsWith( 110 "bar:1: FutureWarning: foo\nbar:1: FutureWarning: foo\n")); 111} 112 113} // namespace testing 114} // namespace py