this repo has no description
at trunk 101 lines 3.4 kB view raw
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