this repo has no description
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2#include "Python.h"
3#include "gtest/gtest.h"
4
5#include "capi-fixture.h"
6#include "capi-testing.h"
7
8namespace py {
9namespace testing {
10
11using CodecsExtensionApiTest = ExtensionApi;
12
13TEST_F(CodecsExtensionApiTest, GetIncrementalDecoderInstantiatesDecoder) {
14 PyRun_SimpleString(R"(
15import codecs
16class Inc(codecs.IncrementalDecoder):
17 def decode(self, input, final=False):
18 return codecs.ascii_decode(input, self.errors)[0]
19
20test = codecs.CodecInfo('test', None, None, incrementaldecoder=Inc)
21 )");
22
23 PyObjectPtr test(mainModuleGet("test"));
24 PyObjectPtr inc_dec(_PyCodecInfo_GetIncrementalDecoder(test, "ignore"));
25 ASSERT_EQ(moduleSet("__main__", "inc_dec", inc_dec), 0);
26
27 PyRun_SimpleString(R"(
28result = inc_dec.decode(b'hel\x80lo')
29 )");
30
31 PyObjectPtr result(mainModuleGet("result"));
32 EXPECT_TRUE(isUnicodeEqualsCStr(result, "hello"));
33}
34
35TEST_F(CodecsExtensionApiTest,
36 LookupTextEncodingWithUnknownEncodingRaisesLookupError) {
37 PyObjectPtr error(_PyCodec_LookupTextEncoding("gibberish", "alt"));
38 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_LookupError));
39 EXPECT_EQ(error, nullptr);
40}
41
42TEST_F(CodecsExtensionApiTest, LookupTextEncodingWithTupleReturnsTuple) {
43 PyRun_SimpleString(R"(
44import _codecs
45_codecs.register(lambda x: (1, 2, 3, 4))
46)");
47 PyObjectPtr codec(_PyCodec_LookupTextEncoding("any", "alt"));
48 ASSERT_EQ(PyErr_Occurred(), nullptr);
49 ASSERT_TRUE(PyTuple_CheckExact(codec));
50 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 0)), 1);
51 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 1)), 2);
52 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 2)), 3);
53 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 3)), 4);
54}
55
56TEST_F(CodecsExtensionApiTest,
57 LookupTextEncodingWithTupleSubclassReturnsTuple) {
58 PyRun_SimpleString(R"(
59import _codecs
60class TupSub(tuple): pass
61_codecs.register(lambda x: TupSub((1, 2, 3, 4)))
62)");
63 PyObjectPtr codec(_PyCodec_LookupTextEncoding("any", "alt"));
64 ASSERT_EQ(PyErr_Occurred(), nullptr);
65 ASSERT_FALSE(PyTuple_CheckExact(codec));
66 ASSERT_TRUE(PyTuple_Check(codec));
67 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 0)), 1);
68 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 1)), 2);
69 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 2)), 3);
70 EXPECT_EQ(PyLong_AsLong(PyTuple_GetItem(codec, 3)), 4);
71}
72
73TEST_F(CodecsExtensionApiTest,
74 LookupTextEncodingWithOverwrittenEncodingFieldRaisesLookupError) {
75 PyRun_SimpleString(R"(
76import _codecs
77class TupSub(tuple):
78 _is_text_encoding = False
79_codecs.register(lambda x: TupSub((1, 2, 3, 4)))
80)");
81 PyObjectPtr error(_PyCodec_LookupTextEncoding("any", "alt"));
82 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_LookupError));
83 EXPECT_EQ(error, nullptr);
84}
85
86TEST_F(CodecsExtensionApiTest, StrictErrorsWithNonExceptionRaisesTypeError) {
87 PyObjectPtr non_exc(PyLong_FromLong(0));
88 EXPECT_EQ(PyCodec_StrictErrors(non_exc), nullptr);
89 ASSERT_NE(PyErr_Occurred(), nullptr);
90 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_TypeError));
91}
92
93TEST_F(CodecsExtensionApiTest, StrictErrorsWithExceptionRaisesIt) {
94 PyObjectPtr exc(PyUnicodeDecodeError_Create("enc", "obj", 3, 1, 2, "rea"));
95 EXPECT_EQ(PyCodec_StrictErrors(exc), nullptr);
96 ASSERT_NE(PyErr_Occurred(), nullptr);
97 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_UnicodeDecodeError));
98}
99
100} // namespace testing
101} // namespace py