122c8efcdSZachary Turner //===-- PythonDataObjectsTests.cpp ------------------------------*- C++ -*-===//
222c8efcdSZachary Turner //
322c8efcdSZachary Turner //                     The LLVM Compiler Infrastructure
422c8efcdSZachary Turner //
522c8efcdSZachary Turner // This file is distributed under the University of Illinois Open Source
622c8efcdSZachary Turner // License. See LICENSE.TXT for details.
722c8efcdSZachary Turner //
822c8efcdSZachary Turner //===----------------------------------------------------------------------===//
922c8efcdSZachary Turner 
1022c8efcdSZachary Turner #include "gtest/gtest.h"
1122c8efcdSZachary Turner 
12*9c40264fSZachary Turner #include "lldb/Host/File.h"
13*9c40264fSZachary Turner #include "lldb/Host/FileSystem.h"
1422c8efcdSZachary Turner #include "lldb/Host/HostInfo.h"
1522c8efcdSZachary Turner #include "Plugins/ScriptInterpreter/Python/lldb-python.h"
1622c8efcdSZachary Turner #include "Plugins/ScriptInterpreter/Python/PythonDataObjects.h"
1722c8efcdSZachary Turner #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h"
1822c8efcdSZachary Turner 
1922c8efcdSZachary Turner using namespace lldb_private;
2022c8efcdSZachary Turner 
2122c8efcdSZachary Turner class PythonDataObjectsTest : public testing::Test
2222c8efcdSZachary Turner {
2322c8efcdSZachary Turner   public:
2422c8efcdSZachary Turner     void
2522c8efcdSZachary Turner     SetUp() override
2622c8efcdSZachary Turner     {
2722c8efcdSZachary Turner         HostInfoBase::Initialize();
28f8b22f8fSZachary Turner         // ScriptInterpreterPython::Initialize() depends on HostInfo being
29f8b22f8fSZachary Turner         // initializedso it can compute the python directory etc.
3022c8efcdSZachary Turner         ScriptInterpreterPython::Initialize();
31f8b22f8fSZachary Turner 
32f8b22f8fSZachary Turner         // Although we don't care about concurrency for the purposes of running
33f8b22f8fSZachary Turner         // this test suite, Python requires the GIL to be locked even for
34f8b22f8fSZachary Turner         // deallocating memory, which can happen when you call Py_DECREF or
35f8b22f8fSZachary Turner         // Py_INCREF.  So acquire the GIL for the entire duration of this
36f8b22f8fSZachary Turner         // test suite.
37f8b22f8fSZachary Turner         m_gil_state = PyGILState_Ensure();
3822c8efcdSZachary Turner     }
3922c8efcdSZachary Turner 
4022c8efcdSZachary Turner     void
4122c8efcdSZachary Turner     TearDown() override
4222c8efcdSZachary Turner     {
43f8b22f8fSZachary Turner         PyGILState_Release(m_gil_state);
44f8b22f8fSZachary Turner 
4522c8efcdSZachary Turner         ScriptInterpreterPython::Terminate();
4622c8efcdSZachary Turner     }
47f8b22f8fSZachary Turner 
48f8b22f8fSZachary Turner   private:
49f8b22f8fSZachary Turner     PyGILState_STATE m_gil_state;
5022c8efcdSZachary Turner };
5122c8efcdSZachary Turner 
52f8b22f8fSZachary Turner TEST_F(PythonDataObjectsTest, TestOwnedReferences)
53f8b22f8fSZachary Turner {
5418426935SZachary Turner     // After creating a new object, the refcount should be >= 1
55f8b22f8fSZachary Turner     PyObject *obj = PyLong_FromLong(3);
5618426935SZachary Turner     Py_ssize_t original_refcnt = obj->ob_refcnt;
5718426935SZachary Turner     EXPECT_LE(1, original_refcnt);
58f8b22f8fSZachary Turner 
5918426935SZachary Turner     // If we take an owned reference, the refcount should be the same
60f8b22f8fSZachary Turner     PythonObject owned_long(PyRefType::Owned, obj);
6118426935SZachary Turner     EXPECT_EQ(original_refcnt, owned_long.get()->ob_refcnt);
62f8b22f8fSZachary Turner 
6318426935SZachary Turner     // Take another reference and verify that the refcount increases by 1
64f8b22f8fSZachary Turner     PythonObject strong_ref(owned_long);
6518426935SZachary Turner     EXPECT_EQ(original_refcnt + 1, strong_ref.get()->ob_refcnt);
66f8b22f8fSZachary Turner 
6718426935SZachary Turner     // If we reset the first one, the refcount should be the original value.
68f8b22f8fSZachary Turner     owned_long.Reset();
6918426935SZachary Turner     EXPECT_EQ(original_refcnt, strong_ref.get()->ob_refcnt);
70f8b22f8fSZachary Turner }
71f8b22f8fSZachary Turner 
72f8b22f8fSZachary Turner TEST_F(PythonDataObjectsTest, TestResetting)
73f8b22f8fSZachary Turner {
74f8b22f8fSZachary Turner     PythonDictionary dict(PyInitialValue::Empty);
75f8b22f8fSZachary Turner 
76f8b22f8fSZachary Turner     PyObject *new_dict = PyDict_New();
77f8b22f8fSZachary Turner     dict.Reset(PyRefType::Owned, new_dict);
78f8b22f8fSZachary Turner     EXPECT_EQ(new_dict, dict.get());
79f8b22f8fSZachary Turner 
80f8b22f8fSZachary Turner     dict.Reset(PyRefType::Owned, nullptr);
81f8b22f8fSZachary Turner     EXPECT_EQ(nullptr, dict.get());
82f8b22f8fSZachary Turner 
83f8b22f8fSZachary Turner     dict.Reset(PyRefType::Owned, PyDict_New());
84f8b22f8fSZachary Turner     EXPECT_NE(nullptr, dict.get());
85f8b22f8fSZachary Turner     dict.Reset();
86f8b22f8fSZachary Turner     EXPECT_EQ(nullptr, dict.get());
87f8b22f8fSZachary Turner }
88f8b22f8fSZachary Turner 
89f8b22f8fSZachary Turner TEST_F(PythonDataObjectsTest, TestBorrowedReferences)
90f8b22f8fSZachary Turner {
91f8b22f8fSZachary Turner     PythonInteger long_value(PyRefType::Owned, PyLong_FromLong(3));
9218426935SZachary Turner     Py_ssize_t original_refcnt = long_value.get()->ob_refcnt;
9318426935SZachary Turner     EXPECT_LE(1, original_refcnt);
94f8b22f8fSZachary Turner 
95f8b22f8fSZachary Turner     PythonInteger borrowed_long(PyRefType::Borrowed, long_value.get());
9618426935SZachary Turner     EXPECT_EQ(original_refcnt + 1, borrowed_long.get()->ob_refcnt);
97f8b22f8fSZachary Turner }
98f8b22f8fSZachary Turner 
9922c8efcdSZachary Turner TEST_F(PythonDataObjectsTest, TestPythonInteger)
10022c8efcdSZachary Turner {
10122c8efcdSZachary Turner // Test that integers behave correctly when wrapped by a PythonInteger.
10222c8efcdSZachary Turner 
10322c8efcdSZachary Turner #if PY_MAJOR_VERSION < 3
10422c8efcdSZachary Turner     // Verify that `PythonInt` works correctly when given a PyInt object.
10522c8efcdSZachary Turner     // Note that PyInt doesn't exist in Python 3.x, so this is only for 2.x
10622c8efcdSZachary Turner     PyObject *py_int = PyInt_FromLong(12);
10722c8efcdSZachary Turner     EXPECT_TRUE(PythonInteger::Check(py_int));
108f8b22f8fSZachary Turner     PythonInteger python_int(PyRefType::Owned, py_int);
10922c8efcdSZachary Turner 
11022c8efcdSZachary Turner     EXPECT_EQ(PyObjectType::Integer, python_int.GetObjectType());
11122c8efcdSZachary Turner     EXPECT_EQ(12, python_int.GetInteger());
11222c8efcdSZachary Turner #endif
11322c8efcdSZachary Turner 
11418426935SZachary Turner     // Verify that `PythonInteger` works correctly when given a PyLong object.
11522c8efcdSZachary Turner     PyObject *py_long = PyLong_FromLong(12);
11622c8efcdSZachary Turner     EXPECT_TRUE(PythonInteger::Check(py_long));
117f8b22f8fSZachary Turner     PythonInteger python_long(PyRefType::Owned, py_long);
11822c8efcdSZachary Turner     EXPECT_EQ(PyObjectType::Integer, python_long.GetObjectType());
11922c8efcdSZachary Turner 
12022c8efcdSZachary Turner     // Verify that you can reset the value and that it is reflected properly.
12122c8efcdSZachary Turner     python_long.SetInteger(40);
12222c8efcdSZachary Turner     EXPECT_EQ(40, python_long.GetInteger());
12318426935SZachary Turner 
12418426935SZachary Turner     // Test that creating a `PythonInteger` object works correctly with the
12518426935SZachary Turner     // int constructor.
12618426935SZachary Turner     PythonInteger constructed_int(7);
12718426935SZachary Turner     EXPECT_EQ(7, constructed_int.GetInteger());
12822c8efcdSZachary Turner }
12922c8efcdSZachary Turner 
13022c8efcdSZachary Turner TEST_F(PythonDataObjectsTest, TestPythonString)
13122c8efcdSZachary Turner {
13222c8efcdSZachary Turner     // Test that strings behave correctly when wrapped by a PythonString.
13322c8efcdSZachary Turner 
13418426935SZachary Turner     static const char *test_string = "PythonDataObjectsTest::TestPythonString1";
13518426935SZachary Turner     static const char *test_string2 = "PythonDataObjectsTest::TestPythonString2";
13618426935SZachary Turner     static const char *test_string3 = "PythonDataObjectsTest::TestPythonString3";
13722c8efcdSZachary Turner 
13822c8efcdSZachary Turner #if PY_MAJOR_VERSION < 3
13922c8efcdSZachary Turner     // Verify that `PythonString` works correctly when given a PyString object.
14022c8efcdSZachary Turner     // Note that PyString doesn't exist in Python 3.x, so this is only for 2.x
14122c8efcdSZachary Turner     PyObject *py_string = PyString_FromString(test_string);
14222c8efcdSZachary Turner     EXPECT_TRUE(PythonString::Check(py_string));
143f8b22f8fSZachary Turner     PythonString python_string(PyRefType::Owned, py_string);
14422c8efcdSZachary Turner 
14522c8efcdSZachary Turner     EXPECT_EQ(PyObjectType::String, python_string.GetObjectType());
14622c8efcdSZachary Turner     EXPECT_STREQ(test_string, python_string.GetString().data());
14718426935SZachary Turner #else
14822c8efcdSZachary Turner     // Verify that `PythonString` works correctly when given a PyUnicode object.
14922c8efcdSZachary Turner     PyObject *py_unicode = PyUnicode_FromString(test_string);
15022c8efcdSZachary Turner     EXPECT_TRUE(PythonString::Check(py_unicode));
151f8b22f8fSZachary Turner     PythonString python_unicode(PyRefType::Owned, py_unicode);
15222c8efcdSZachary Turner     EXPECT_EQ(PyObjectType::String, python_unicode.GetObjectType());
15322c8efcdSZachary Turner     EXPECT_STREQ(test_string, python_unicode.GetString().data());
15418426935SZachary Turner #endif
15522c8efcdSZachary Turner 
15618426935SZachary Turner     // Test that creating a `PythonString` object works correctly with the
15718426935SZachary Turner     // string constructor
15818426935SZachary Turner     PythonString constructed_string(test_string3);
15918426935SZachary Turner     EXPECT_STREQ(test_string3, constructed_string.GetString().str().c_str());
16022c8efcdSZachary Turner }
16122c8efcdSZachary Turner 
16218426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonStringToStr)
16318426935SZachary Turner {
16418426935SZachary Turner     const char *c_str = "PythonDataObjectsTest::TestPythonStringToStr";
16518426935SZachary Turner 
16618426935SZachary Turner     PythonString str(c_str);
16718426935SZachary Turner     EXPECT_STREQ(c_str, str.GetString().str().c_str());
16818426935SZachary Turner 
16918426935SZachary Turner     PythonString str_str = str.Str();
17018426935SZachary Turner     EXPECT_STREQ(c_str, str_str.GetString().str().c_str());
17118426935SZachary Turner }
17218426935SZachary Turner 
17318426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonIntegerToStr)
17418426935SZachary Turner {
17518426935SZachary Turner }
17618426935SZachary Turner 
17718426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonIntegerToStructuredInteger)
17818426935SZachary Turner {
17918426935SZachary Turner     PythonInteger integer(7);
18018426935SZachary Turner     auto int_sp = integer.CreateStructuredInteger();
18118426935SZachary Turner     EXPECT_EQ(7, int_sp->GetValue());
18218426935SZachary Turner }
18318426935SZachary Turner 
18418426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonStringToStructuredString)
18518426935SZachary Turner {
18618426935SZachary Turner     static const char *test_string = "PythonDataObjectsTest::TestPythonStringToStructuredString";
18718426935SZachary Turner     PythonString constructed_string(test_string);
18818426935SZachary Turner     auto string_sp = constructed_string.CreateStructuredString();
18918426935SZachary Turner     EXPECT_STREQ(test_string, string_sp->GetStringValue().c_str());
19018426935SZachary Turner }
19118426935SZachary Turner 
19218426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonListValueEquality)
19322c8efcdSZachary Turner {
19422c8efcdSZachary Turner     // Test that a list which is built through the native
19522c8efcdSZachary Turner     // Python API behaves correctly when wrapped by a PythonList.
19622c8efcdSZachary Turner     static const int list_size = 2;
19718426935SZachary Turner     static const long long_value0 = 5;
19818426935SZachary Turner     static const char *const string_value1 = "String Index 1";
19922c8efcdSZachary Turner 
20022c8efcdSZachary Turner     PyObject *py_list = PyList_New(2);
201f8b22f8fSZachary Turner     EXPECT_TRUE(PythonList::Check(py_list));
202f8b22f8fSZachary Turner     PythonList list(PyRefType::Owned, py_list);
203f8b22f8fSZachary Turner 
204f8b22f8fSZachary Turner     PythonObject list_items[list_size];
20518426935SZachary Turner     list_items[0].Reset(PythonInteger(long_value0));
20618426935SZachary Turner     list_items[1].Reset(PythonString(string_value1));
20722c8efcdSZachary Turner 
20822c8efcdSZachary Turner     for (int i = 0; i < list_size; ++i)
209f8b22f8fSZachary Turner         list.SetItemAtIndex(i, list_items[i]);
21022c8efcdSZachary Turner 
21122c8efcdSZachary Turner     EXPECT_EQ(list_size, list.GetSize());
21222c8efcdSZachary Turner     EXPECT_EQ(PyObjectType::List, list.GetObjectType());
21322c8efcdSZachary Turner 
21418426935SZachary Turner     // Verify that the values match
21518426935SZachary Turner     PythonObject chk_value1 = list.GetItemAtIndex(0);
21618426935SZachary Turner     PythonObject chk_value2 = list.GetItemAtIndex(1);
21718426935SZachary Turner     EXPECT_TRUE(PythonInteger::Check(chk_value1.get()));
21818426935SZachary Turner     EXPECT_TRUE(PythonString::Check(chk_value2.get()));
21922c8efcdSZachary Turner 
22018426935SZachary Turner     PythonInteger chk_int(PyRefType::Borrowed, chk_value1.get());
22118426935SZachary Turner     PythonString chk_str(PyRefType::Borrowed, chk_value2.get());
22222c8efcdSZachary Turner 
22318426935SZachary Turner     EXPECT_EQ(long_value0, chk_int.GetInteger());
22418426935SZachary Turner     EXPECT_STREQ(string_value1, chk_str.GetString().str().c_str());
22522c8efcdSZachary Turner }
22622c8efcdSZachary Turner 
22722c8efcdSZachary Turner TEST_F(PythonDataObjectsTest, TestPythonListManipulation)
22822c8efcdSZachary Turner {
22922c8efcdSZachary Turner     // Test that manipulation of a PythonList behaves correctly when
23022c8efcdSZachary Turner     // wrapped by a PythonDictionary.
23122c8efcdSZachary Turner 
23218426935SZachary Turner     static const long long_value0 = 5;
23318426935SZachary Turner     static const char *const string_value1 = "String Index 1";
23422c8efcdSZachary Turner 
235f8b22f8fSZachary Turner     PythonList list(PyInitialValue::Empty);
23618426935SZachary Turner     PythonInteger integer(long_value0);
23718426935SZachary Turner     PythonString string(string_value1);
23822c8efcdSZachary Turner 
23922c8efcdSZachary Turner     list.AppendItem(integer);
24022c8efcdSZachary Turner     list.AppendItem(string);
24122c8efcdSZachary Turner     EXPECT_EQ(2, list.GetSize());
24222c8efcdSZachary Turner 
24318426935SZachary Turner     // Verify that the values match
24418426935SZachary Turner     PythonObject chk_value1 = list.GetItemAtIndex(0);
24518426935SZachary Turner     PythonObject chk_value2 = list.GetItemAtIndex(1);
24618426935SZachary Turner     EXPECT_TRUE(PythonInteger::Check(chk_value1.get()));
24718426935SZachary Turner     EXPECT_TRUE(PythonString::Check(chk_value2.get()));
24818426935SZachary Turner 
24918426935SZachary Turner     PythonInteger chk_int(PyRefType::Borrowed, chk_value1.get());
25018426935SZachary Turner     PythonString chk_str(PyRefType::Borrowed, chk_value2.get());
25118426935SZachary Turner 
25218426935SZachary Turner     EXPECT_EQ(long_value0, chk_int.GetInteger());
25318426935SZachary Turner     EXPECT_STREQ(string_value1, chk_str.GetString().str().c_str());
25418426935SZachary Turner }
25518426935SZachary Turner 
25618426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonListToStructuredList)
25718426935SZachary Turner {
25818426935SZachary Turner     static const long long_value0 = 5;
25918426935SZachary Turner     static const char *const string_value1 = "String Index 1";
26018426935SZachary Turner 
26118426935SZachary Turner     PythonList list(PyInitialValue::Empty);
26218426935SZachary Turner     list.AppendItem(PythonInteger(long_value0));
26318426935SZachary Turner     list.AppendItem(PythonString(string_value1));
26418426935SZachary Turner 
26518426935SZachary Turner     auto array_sp = list.CreateStructuredArray();
26618426935SZachary Turner     EXPECT_EQ(StructuredData::Type::eTypeInteger, array_sp->GetItemAtIndex(0)->GetType());
26718426935SZachary Turner     EXPECT_EQ(StructuredData::Type::eTypeString, array_sp->GetItemAtIndex(1)->GetType());
26818426935SZachary Turner 
26918426935SZachary Turner     auto int_sp = array_sp->GetItemAtIndex(0)->GetAsInteger();
27018426935SZachary Turner     auto string_sp = array_sp->GetItemAtIndex(1)->GetAsString();
27118426935SZachary Turner 
27218426935SZachary Turner     EXPECT_EQ(long_value0, int_sp->GetValue());
27318426935SZachary Turner     EXPECT_STREQ(string_value1, string_sp->GetValue().c_str());
27418426935SZachary Turner }
27518426935SZachary Turner 
27618426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonDictionaryValueEquality)
27718426935SZachary Turner {
27818426935SZachary Turner     // Test that a dictionary which is built through the native
27918426935SZachary Turner     // Python API behaves correctly when wrapped by a PythonDictionary.
28018426935SZachary Turner     static const int dict_entries = 2;
28118426935SZachary Turner     const char *key_0 = "Key 0";
28218426935SZachary Turner     int key_1 = 1;
28318426935SZachary Turner     const int value_0 = 0;
28418426935SZachary Turner     const char *value_1 = "Value 1";
28518426935SZachary Turner 
28618426935SZachary Turner     PythonObject py_keys[dict_entries];
28718426935SZachary Turner     PythonObject py_values[dict_entries];
28818426935SZachary Turner 
28918426935SZachary Turner     py_keys[0].Reset(PythonString(key_0));
29018426935SZachary Turner     py_keys[1].Reset(PythonInteger(key_1));
29118426935SZachary Turner     py_values[0].Reset(PythonInteger(value_0));
29218426935SZachary Turner     py_values[1].Reset(PythonString(value_1));
29318426935SZachary Turner 
29418426935SZachary Turner     PyObject *py_dict = PyDict_New();
29518426935SZachary Turner     EXPECT_TRUE(PythonDictionary::Check(py_dict));
29618426935SZachary Turner     PythonDictionary dict(PyRefType::Owned, py_dict);
29718426935SZachary Turner 
29818426935SZachary Turner     for (int i = 0; i < dict_entries; ++i)
29918426935SZachary Turner         PyDict_SetItem(py_dict, py_keys[i].get(), py_values[i].get());
30018426935SZachary Turner     EXPECT_EQ(dict.GetSize(), dict_entries);
30118426935SZachary Turner     EXPECT_EQ(PyObjectType::Dictionary, dict.GetObjectType());
30218426935SZachary Turner 
30318426935SZachary Turner     // Verify that the values match
30418426935SZachary Turner     PythonObject chk_value1 = dict.GetItemForKey(py_keys[0]);
30518426935SZachary Turner     PythonObject chk_value2 = dict.GetItemForKey(py_keys[1]);
30618426935SZachary Turner     EXPECT_TRUE(PythonInteger::Check(chk_value1.get()));
30718426935SZachary Turner     EXPECT_TRUE(PythonString::Check(chk_value2.get()));
30818426935SZachary Turner 
30918426935SZachary Turner     PythonInteger chk_int(PyRefType::Borrowed, chk_value1.get());
31018426935SZachary Turner     PythonString chk_str(PyRefType::Borrowed, chk_value2.get());
31118426935SZachary Turner 
31218426935SZachary Turner     EXPECT_EQ(value_0, chk_int.GetInteger());
31318426935SZachary Turner     EXPECT_STREQ(value_1, chk_str.GetString().str().c_str());
31422c8efcdSZachary Turner }
31522c8efcdSZachary Turner 
31622c8efcdSZachary Turner TEST_F(PythonDataObjectsTest, TestPythonDictionaryManipulation)
31722c8efcdSZachary Turner {
31822c8efcdSZachary Turner     // Test that manipulation of a dictionary behaves correctly when wrapped
31922c8efcdSZachary Turner     // by a PythonDictionary.
32022c8efcdSZachary Turner     static const int dict_entries = 2;
32122c8efcdSZachary Turner 
32218426935SZachary Turner     const char *const key_0 = "Key 0";
32318426935SZachary Turner     const char *const key_1 = "Key 1";
32418426935SZachary Turner     const long value_0 = 1;
32518426935SZachary Turner     const char *const value_1 = "Value 1";
32618426935SZachary Turner 
327f8b22f8fSZachary Turner     PythonString keys[dict_entries];
328f8b22f8fSZachary Turner     PythonObject values[dict_entries];
32922c8efcdSZachary Turner 
33018426935SZachary Turner     keys[0].Reset(PythonString(key_0));
33118426935SZachary Turner     keys[1].Reset(PythonString(key_1));
33218426935SZachary Turner     values[0].Reset(PythonInteger(value_0));
33318426935SZachary Turner     values[1].Reset(PythonString(value_1));
33422c8efcdSZachary Turner 
335f8b22f8fSZachary Turner     PythonDictionary dict(PyInitialValue::Empty);
33622c8efcdSZachary Turner     for (int i = 0; i < 2; ++i)
337f8b22f8fSZachary Turner         dict.SetItemForKey(keys[i], values[i]);
33822c8efcdSZachary Turner 
33922c8efcdSZachary Turner     EXPECT_EQ(dict_entries, dict.GetSize());
34022c8efcdSZachary Turner 
34118426935SZachary Turner     // Verify that the keys and values match
34218426935SZachary Turner     PythonObject chk_value1 = dict.GetItemForKey(keys[0]);
34318426935SZachary Turner     PythonObject chk_value2 = dict.GetItemForKey(keys[1]);
34418426935SZachary Turner     EXPECT_TRUE(PythonInteger::Check(chk_value1.get()));
34518426935SZachary Turner     EXPECT_TRUE(PythonString::Check(chk_value2.get()));
34618426935SZachary Turner 
34718426935SZachary Turner     PythonInteger chk_int(PyRefType::Borrowed, chk_value1.get());
34818426935SZachary Turner     PythonString chk_str(PyRefType::Borrowed, chk_value2.get());
34918426935SZachary Turner 
35018426935SZachary Turner     EXPECT_EQ(value_0, chk_int.GetInteger());
35118426935SZachary Turner     EXPECT_STREQ(value_1, chk_str.GetString().str().c_str());
35222c8efcdSZachary Turner }
35322c8efcdSZachary Turner 
35418426935SZachary Turner TEST_F(PythonDataObjectsTest, TestPythonDictionaryToStructuredDictionary)
35522c8efcdSZachary Turner {
35618426935SZachary Turner     static const char *const string_key0 = "String Key 0";
35718426935SZachary Turner     static const char *const string_key1 = "String Key 1";
35822c8efcdSZachary Turner 
35918426935SZachary Turner     static const char *const string_value0 = "String Value 0";
36018426935SZachary Turner     static const long int_value1 = 7;
36122c8efcdSZachary Turner 
362f8b22f8fSZachary Turner     PythonDictionary dict(PyInitialValue::Empty);
36318426935SZachary Turner     dict.SetItemForKey(PythonString(string_key0), PythonString(string_value0));
36418426935SZachary Turner     dict.SetItemForKey(PythonString(string_key1), PythonInteger(int_value1));
36522c8efcdSZachary Turner 
36618426935SZachary Turner     auto dict_sp = dict.CreateStructuredDictionary();
36718426935SZachary Turner     EXPECT_EQ(2, dict_sp->GetSize());
36822c8efcdSZachary Turner 
36918426935SZachary Turner     EXPECT_TRUE(dict_sp->HasKey(string_key0));
37018426935SZachary Turner     EXPECT_TRUE(dict_sp->HasKey(string_key1));
37122c8efcdSZachary Turner 
37218426935SZachary Turner     auto string_sp = dict_sp->GetValueForKey(string_key0)->GetAsString();
37318426935SZachary Turner     auto int_sp = dict_sp->GetValueForKey(string_key1)->GetAsInteger();
37422c8efcdSZachary Turner 
37518426935SZachary Turner     EXPECT_STREQ(string_value0, string_sp->GetValue().c_str());
37618426935SZachary Turner     EXPECT_EQ(int_value1, int_sp->GetValue());
37722c8efcdSZachary Turner }
378*9c40264fSZachary Turner 
379*9c40264fSZachary Turner TEST_F(PythonDataObjectsTest, TestPythonFile)
380*9c40264fSZachary Turner {
381*9c40264fSZachary Turner     File file(FileSystem::DEV_NULL, File::eOpenOptionRead);
382*9c40264fSZachary Turner     PythonFile py_file(file, "r");
383*9c40264fSZachary Turner     EXPECT_TRUE(PythonFile::Check(py_file.get()));
384*9c40264fSZachary Turner }
385