public void ViewManagersPropertyCache_ShadowNode_Set()
        {
            var instance = new ShadowNodeValueTest();

            var setters = ViewManagersPropertyCache.GetNativePropertySettersForShadowNodeType(typeof(ShadowNodeValueTest));

            Assert.AreEqual(3, setters.Count);

            var props = new ReactStylesDiffMap(new JObject
            {
                { "Foo", 42 },
                { "Qux1", "v2" },
                { "Qux2", "v3" },
            });

            AssertEx.Throws <NotSupportedException>(() => setters["Foo"].UpdateViewManagerProperty(new ViewManagerValueTest(), null, props));
            AssertEx.Throws <ArgumentNullException>(
                () => setters["Foo"].UpdateShadowNodeProperty(null, props),
                ex => Assert.AreEqual("shadowNode", ex.ParamName));
            AssertEx.Throws <ArgumentNullException>(
                () => setters["Foo"].UpdateShadowNodeProperty(instance, null),
                ex => Assert.AreEqual("props", ex.ParamName));

            setters["Foo"].UpdateShadowNodeProperty(instance, props);
            setters["Qux1"].UpdateShadowNodeProperty(instance, props);
            setters["Qux2"].UpdateShadowNodeProperty(instance, props);

            Assert.AreEqual(42, instance.FooValue);
            Assert.AreEqual("v2", instance.QuxValues[0]);
            Assert.AreEqual("v3", instance.QuxValues[1]);
        }
        public void ViewManagersPropertyCache_ViewManager_Set()
        {
            var instance = new ViewManagerValueTest();

            var setters = ViewManagersPropertyCache.GetNativePropertySettersForViewManagerType(typeof(ViewManagerValueTest));

            Assert.AreEqual(3, setters.Count);

            var props = new ReactStylesDiffMap(new JObject
            {
                { "Foo", "v1" },
                { "Bar1", "v2" },
                { "Bar2", "v3" },
            });

            Assert.Throws <NotSupportedException>(() => setters["Foo"].UpdateShadowNodeProperty(new ShadowNodeValueTest(), props));
            ArgumentNullException ex1 = Assert.Throws <ArgumentNullException>(
                () => setters["Foo"].UpdateViewManagerProperty(null, null, props));

            Assert.AreEqual("viewManager", ex1.ParamName);
            ArgumentNullException ex2 = Assert.Throws <ArgumentNullException>(
                () => setters["Foo"].UpdateViewManagerProperty(instance, null, null));

            Assert.AreEqual("props", ex2.ParamName);

            setters["Foo"].UpdateViewManagerProperty(instance, null, props);
            setters["Bar1"].UpdateViewManagerProperty(instance, null, props);
            setters["Bar2"].UpdateViewManagerProperty(instance, null, props);

            Assert.AreEqual("v1", instance.FooValue);
            Assert.AreEqual("v2", instance.BarValues[0]);
            Assert.AreEqual("v3", instance.BarValues[1]);
        }
        public void ViewManagersPropertyCache_GetNativePropertiesForView()
        {
            var props = ViewManagersPropertyCache.GetNativePropertiesForView(typeof(ViewManagerValueTest), typeof(ShadowNodeValueTest));

            Assert.AreEqual(5, props.Count);
            Assert.AreEqual("number", props["Foo"]);
            Assert.AreEqual("String", props["Bar1"]);
            Assert.AreEqual("String", props["Bar2"]);
            Assert.AreEqual("String", props["Qux1"]);
            Assert.AreEqual("String", props["Qux2"]);
        }
        public void ViewManagersPropertyCache_ArgumentChecks()
        {
            AssertEx.Throws <ArgumentNullException>(
                () => ViewManagersPropertyCache.GetNativePropertiesForView(null, typeof(object)),
                ex => Assert.AreEqual("viewManagerType", ex.ParamName));

            AssertEx.Throws <ArgumentNullException>(
                () => ViewManagersPropertyCache.GetNativePropertiesForView(typeof(object), null),
                ex => Assert.AreEqual("shadowNodeType", ex.ParamName));

            AssertEx.Throws <ArgumentNullException>(
                () => ViewManagersPropertyCache.GetNativePropertySettersForViewManagerType(null),
                ex => Assert.AreEqual("type", ex.ParamName));

            AssertEx.Throws <ArgumentNullException>(
                () => ViewManagersPropertyCache.GetNativePropertySettersForShadowNodeType
                    (null),
                ex => Assert.AreEqual("type", ex.ParamName));
        }
        public void ViewManagersPropertyCache_ShadowNode_Empty()
        {
            var setters = ViewManagersPropertyCache.GetNativePropertySettersForShadowNodeType(typeof(ReactShadowNode));

            Assert.AreEqual(0, setters.Count);
        }
        public void ViewManagersPropertyCache_Defaults()
        {
            var instance = new DefaultsTest();
            var setters  = ViewManagersPropertyCache.GetNativePropertySettersForViewManagerType(typeof(DefaultsTest));

            var props = new ReactStylesDiffMap(new JObject());

            instance.ByteValue     = byte.MaxValue;
            instance.SByteValue    = sbyte.MaxValue;
            instance.Int16Value    = short.MaxValue;
            instance.UInt16Value   = ushort.MaxValue;
            instance.Int32Value    = int.MaxValue;
            instance.UInt32Value   = uint.MaxValue;
            instance.Int64Value    = long.MaxValue;
            instance.UInt64Value   = ulong.MaxValue;
            instance.SingleValue   = float.MaxValue;
            instance.DoubleValue   = double.MaxValue;
            instance.DecimalValue  = decimal.MaxValue;
            instance.BooleanValue  = true;
            instance.StringValue   = "foo";
            instance.ArrayValue    = new int[0];
            instance.MapValue      = new object();
            instance.NullableValue = true;
            instance.GroupValue    = new[] { "a", "b", "c" };

            setters["TestByte"].UpdateViewManagerProperty(instance, null, props);
            setters["TestSByte"].UpdateViewManagerProperty(instance, null, props);
            setters["TestInt16"].UpdateViewManagerProperty(instance, null, props);
            setters["TestUInt16"].UpdateViewManagerProperty(instance, null, props);
            setters["TestInt32"].UpdateViewManagerProperty(instance, null, props);
            setters["TestUInt32"].UpdateViewManagerProperty(instance, null, props);
            setters["TestInt64"].UpdateViewManagerProperty(instance, null, props);
            setters["TestUInt64"].UpdateViewManagerProperty(instance, null, props);
            setters["TestSingle"].UpdateViewManagerProperty(instance, null, props);
            setters["TestDouble"].UpdateViewManagerProperty(instance, null, props);
            setters["TestDecimal"].UpdateViewManagerProperty(instance, null, props);
            setters["TestBoolean"].UpdateViewManagerProperty(instance, null, props);
            setters["TestString"].UpdateViewManagerProperty(instance, null, props);
            setters["TestArray"].UpdateViewManagerProperty(instance, null, props);
            setters["TestMap"].UpdateViewManagerProperty(instance, null, props);
            setters["TestNullable"].UpdateViewManagerProperty(instance, null, props);
            setters["foo"].UpdateViewManagerProperty(instance, null, props);
            setters["bar"].UpdateViewManagerProperty(instance, null, props);
            setters["baz"].UpdateViewManagerProperty(instance, null, props);

            Assert.AreEqual(0, instance.ByteValue);
            Assert.AreEqual(0, instance.SByteValue);
            Assert.AreEqual(0, instance.Int16Value);
            Assert.AreEqual(0, instance.UInt16Value);
            Assert.AreEqual(0, instance.Int32Value);
            Assert.AreEqual((uint)0, instance.UInt32Value);
            Assert.AreEqual(0, instance.Int64Value);
            Assert.AreEqual((ulong)0, instance.UInt64Value);
            Assert.AreEqual(0, instance.SingleValue);
            Assert.AreEqual(0, instance.DoubleValue);
            Assert.AreEqual(0, instance.DecimalValue);
            Assert.IsFalse(instance.BooleanValue);
            Assert.IsNull(instance.StringValue);
            Assert.IsNull(instance.ArrayValue);
            Assert.IsNull(instance.MapValue);
            Assert.IsFalse(instance.NullableValue.HasValue);
            Assert.IsNull(instance.GroupValue[0]);
            Assert.IsNull(instance.GroupValue[1]);
            Assert.IsNull(instance.GroupValue[2]);
        }