this repo has no description
at trunk 186 lines 7.4 kB view raw
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 2#include "gtest/gtest.h" 3 4#include "builtins.h" 5#include "test-utils.h" 6 7namespace py { 8namespace testing { 9 10using CodeBuiltinsTest = RuntimeFixture; 11 12static RawObject makeTestCode() { 13 Thread* thread = Thread::current(); 14 HandleScope scope(thread); 15 Runtime* runtime = thread->runtime(); 16 const byte bytes_array[] = {100, 0, 83, 0}; 17 Bytes bytes(&scope, runtime->newBytesWithAll(bytes_array)); 18 Object const0(&scope, runtime->newStrFromCStr("const0")); 19 Tuple consts(&scope, runtime->newTupleWith1(const0)); 20 Object name0(&scope, runtime->newStrFromCStr("name0")); 21 Tuple names(&scope, runtime->newTupleWith1(name0)); 22 Object var0(&scope, runtime->newStrFromCStr("var0")); 23 Object var1(&scope, runtime->newStrFromCStr("var1")); 24 Tuple varnames(&scope, runtime->newTupleWith2(var0, var1)); 25 Object freevar0(&scope, runtime->newStrFromCStr("freevar0")); 26 Tuple freevars(&scope, runtime->newTupleWith1(freevar0)); 27 Object cellvar0(&scope, runtime->newStrFromCStr("cellvar0")); 28 Tuple cellvars(&scope, runtime->newTupleWith1(cellvar0)); 29 Object filename(&scope, runtime->newStrFromCStr("filename0")); 30 Object name(&scope, runtime->newStrFromCStr("name0")); 31 byte lnotab_array[] = {'l', 'n', 'o', 't', 'a', 'b'}; 32 Object lnotab(&scope, runtime->newBytesWithAll(lnotab_array)); 33 word argcount = 0; 34 word posonlyargcount = 0; 35 word kwonlyargcount = 1; 36 word nlocals = 2; 37 word stacksize = 3; 38 word flags = Code::Flags::kNested | Code::Flags::kGenerator; 39 word firstlineno = 5; 40 return runtime->newCode(argcount, posonlyargcount, kwonlyargcount, nlocals, 41 stacksize, flags, bytes, consts, names, varnames, 42 freevars, cellvars, filename, name, firstlineno, 43 lnotab); 44} 45 46TEST_F(CodeBuiltinsTest, CoArgcountReturnsArgcount) { 47 HandleScope scope(thread_); 48 Object code(&scope, makeTestCode()); 49 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_argcount")); 50 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 51 EXPECT_TRUE(isIntEqualsWord(*result, 0)); 52} 53 54TEST_F(CodeBuiltinsTest, CoPosonlyargcountReturnsPosonlyargcount) { 55 HandleScope scope(thread_); 56 Object code(&scope, makeTestCode()); 57 Object name(&scope, 58 Runtime::internStrFromCStr(thread_, "co_posonlyargcount")); 59 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 60 EXPECT_TRUE(isIntEqualsWord(*result, 0)); 61} 62 63TEST_F(CodeBuiltinsTest, CoKwonlyargcountReturnsKwonlyargcount) { 64 HandleScope scope(thread_); 65 Object code(&scope, makeTestCode()); 66 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_kwonlyargcount")); 67 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 68 EXPECT_TRUE(isIntEqualsWord(*result, 1)); 69} 70 71TEST_F(CodeBuiltinsTest, CoNlocalsReturnsNLocals) { 72 HandleScope scope(thread_); 73 Object code(&scope, makeTestCode()); 74 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_nlocals")); 75 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 76 EXPECT_TRUE(isIntEqualsWord(*result, 2)); 77} 78 79TEST_F(CodeBuiltinsTest, CoStacksizeReturnsStacksize) { 80 HandleScope scope(thread_); 81 Object code(&scope, makeTestCode()); 82 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_stacksize")); 83 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 84 EXPECT_TRUE(isIntEqualsWord(*result, 3)); 85} 86 87TEST_F(CodeBuiltinsTest, CoFlagsReturnsFlags) { 88 HandleScope scope(thread_); 89 Object code(&scope, makeTestCode()); 90 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_flags")); 91 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 92 EXPECT_TRUE( 93 isIntEqualsWord(*result, Code::Flags::kNested | Code::Flags::kGenerator)); 94} 95 96TEST_F(CodeBuiltinsTest, CoCodeReturnsCode) { 97 HandleScope scope(thread_); 98 Object code(&scope, makeTestCode()); 99 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_code")); 100 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 101 byte reference[] = {100, 0, 83, 0}; 102 EXPECT_TRUE(isBytesEqualsBytes(result, reference)); 103} 104 105TEST_F(CodeBuiltinsTest, CoConstsReturnsConsts) { 106 HandleScope scope(thread_); 107 Object code(&scope, makeTestCode()); 108 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_consts")); 109 Object result_obj(&scope, runtime_->attributeAt(thread_, code, name)); 110 ASSERT_TRUE(result_obj.isTuple()); 111 Tuple result(&scope, *result_obj); 112 ASSERT_EQ(result.length(), 1); 113 EXPECT_TRUE(isStrEqualsCStr(result.at(0), "const0")); 114} 115 116TEST_F(CodeBuiltinsTest, CoNamesReturnsNames) { 117 HandleScope scope(thread_); 118 Object code(&scope, makeTestCode()); 119 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_names")); 120 Object result_obj(&scope, runtime_->attributeAt(thread_, code, name)); 121 ASSERT_TRUE(result_obj.isTuple()); 122 Tuple result(&scope, *result_obj); 123 ASSERT_EQ(result.length(), 1); 124 EXPECT_TRUE(isStrEqualsCStr(result.at(0), "name0")); 125} 126 127TEST_F(CodeBuiltinsTest, CoVarnamesReturnsVarnames) { 128 HandleScope scope(thread_); 129 Object code(&scope, makeTestCode()); 130 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_varnames")); 131 Object result_obj(&scope, runtime_->attributeAt(thread_, code, name)); 132 ASSERT_TRUE(result_obj.isTuple()); 133 Tuple result(&scope, *result_obj); 134 ASSERT_EQ(result.length(), 2); 135 EXPECT_TRUE(isStrEqualsCStr(result.at(0), "var0")); 136 EXPECT_TRUE(isStrEqualsCStr(result.at(1), "var1")); 137} 138 139TEST_F(CodeBuiltinsTest, CoFreevarsReturnsFreevars) { 140 HandleScope scope(thread_); 141 Object code(&scope, makeTestCode()); 142 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_freevars")); 143 Object result_obj(&scope, runtime_->attributeAt(thread_, code, name)); 144 ASSERT_TRUE(result_obj.isTuple()); 145 Tuple result(&scope, *result_obj); 146 ASSERT_EQ(result.length(), 1); 147 EXPECT_TRUE(isStrEqualsCStr(result.at(0), "freevar0")); 148} 149 150TEST_F(CodeBuiltinsTest, CoCellvarsReturnsCellvars) { 151 HandleScope scope(thread_); 152 Object code(&scope, makeTestCode()); 153 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_cellvars")); 154 Object result_obj(&scope, runtime_->attributeAt(thread_, code, name)); 155 ASSERT_TRUE(result_obj.isTuple()); 156 Tuple result(&scope, *result_obj); 157 ASSERT_EQ(result.length(), 1); 158 EXPECT_TRUE(isStrEqualsCStr(result.at(0), "cellvar0")); 159} 160 161TEST_F(CodeBuiltinsTest, CoFilenameReturnsFilename) { 162 HandleScope scope(thread_); 163 Object code(&scope, makeTestCode()); 164 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_filename")); 165 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 166 EXPECT_TRUE(isStrEqualsCStr(*result, "filename0")); 167} 168 169TEST_F(CodeBuiltinsTest, CoFilenameReturnsName) { 170 HandleScope scope(thread_); 171 Object code(&scope, makeTestCode()); 172 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_name")); 173 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 174 EXPECT_TRUE(isStrEqualsCStr(*result, "name0")); 175} 176 177TEST_F(CodeBuiltinsTest, CoLnotabReturnsLnotab) { 178 HandleScope scope(thread_); 179 Object code(&scope, makeTestCode()); 180 Object name(&scope, Runtime::internStrFromCStr(thread_, "co_lnotab")); 181 Object result(&scope, runtime_->attributeAt(thread_, code, name)); 182 EXPECT_TRUE(isBytesEqualsCStr(result, "lnotab")); 183} 184 185} // namespace testing 186} // namespace py