public void UTinyObject_Dynamic_PrimitiveValue()
        {
            // Untyped dynamic object
            var @object = new UTinyObject(m_Registry, UTinyType.Reference.None)
            {
                ["Foo"] = "Test",
                ["Bar"] = 10
            };

            Assert.AreEqual("Test", @object["Foo"]);
            Assert.AreEqual(10, @object["Bar"]);

            Debug.Log(@object.ToString());
        }
        public void UTinyObject_Dynamic_List()
        {
            // Untyped dynamic object
            var @object = new UTinyObject(m_Registry, UTinyType.Reference.None)
            {
                ["Foo"] = new UTinyList(m_Registry, UTinyType.Reference.None)
                {
                    "a", "b", "c"
                },
                ["Bar"] = new UTinyList(m_Registry, UTinyType.Reference.None)
                {
                    3, 6, 9
                }
            };

            Debug.Log(@object.ToString());
        }
        public void UTinyObject_FieldRename()
        {
            var @object = new UTinyObject(m_Registry, (UTinyType.Reference)m_TestStruct)
            {
                ["Foo"] = "Test",
                ["Bar"] = 10
            };

            m_TestStruct.Fields[0].Name = "Baz";

            // Dynamic values should be promoted to field values
            @object.Refresh();

            Assert.AreEqual("Test", @object["Baz"]);
            Assert.AreEqual(10, @object["Bar"]);

            Debug.Log(@object.ToString());
        }
        public void UTinyObject_Dynamic_NestedObject()
        {
            // Untyped dynamic object
            var @object = new UTinyObject(m_Registry, UTinyType.Reference.None)
            {
                ["TestStructField"] = new UTinyObject(m_Registry, UTinyType.Reference.None)
                {
                    ["Foo"] = "Test",
                    ["Bar"] = 10
                },
                ["Baz"] = 1.3F
            };

            Assert.AreEqual("Test", (@object["TestStructField"] as UTinyObject)?["Foo"]);
            Assert.AreEqual(10, (@object["TestStructField"] as UTinyObject)?["Bar"]);
            Assert.AreEqual(1.3F, @object["Baz"]);

            Debug.Log(@object.ToString());
        }
        public void UTinyObject_Dynamic_PrimitiveValuePromotion()
        {
            // Untyped dynamic object
            var @object = new UTinyObject(m_Registry, UTinyType.Reference.None)
            {
                ["Foo"] = "Test",
                ["Bar"] = 10
            };

            // Assign a type to it
            @object.Type = (UTinyType.Reference)m_TestStruct;

            // Dynamic values should be promoted to field values
            @object.Refresh();

            Assert.AreEqual("Test", @object["Foo"]);
            Assert.AreEqual(10, @object["Bar"]);

            Debug.Log(@object.ToString());
        }
        public void UTinyObject_Dynamic_ListPromotion()
        {
            // Untyped dynamic object
            var @object = new UTinyObject(m_Registry, UTinyType.Reference.None)
            {
                ["Foo"] = new UTinyList(m_Registry, UTinyType.Reference.None)
                {
                    "a", "b", "c"
                },
                ["Bar"] = new UTinyList(m_Registry, UTinyType.Reference.None)
                {
                    3, 6, 9
                }
            };

            @object.Type = (UTinyType.Reference)m_TestStructWithList;
            @object.Refresh();

            Debug.Log(@object.ToString());
        }
        public void UTinyObject_Dynamic_NestedObjectPromotion()
        {
            // Untyped dynamic object
            var @object = new UTinyObject(m_Registry, UTinyType.Reference.None)
            {
                ["TestStructField"] = new UTinyObject(m_Registry, UTinyType.Reference.None)
                {
                    ["Dynamic"] = "Value",
                    ["Foo"]     = "Test",
                    // Bar should be auto generated in its default state
                },
                ["Baz"] = 1.3f
            };

            @object.Type = (UTinyType.Reference)m_TestComponent;
            @object.Refresh();

            // Assert.AreEqual("Value", (@object["TestStructField"] as UTinyObject)?["Dynamic"]);
            Assert.AreEqual("Test", (@object["TestStructField"] as UTinyObject)?["Foo"]);
            Assert.AreEqual(0, (@object["TestStructField"] as UTinyObject)?["Bar"]);
            // Assert.AreEqual(1.3F, @object["Baz"]);

            Debug.Log(@object.ToString());
        }