this repo has no description
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