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