private void RunAssertionSelectNested(string typename, FunctionSendEvent4Int send)
        {
            var epl = "select " +
                      "l1[0].lvl1 as c0, " +
                      "exists(l1[0].lvl1) as exists_c0, " +
                      "l1[0].l2[0].lvl2 as c1, " +
                      "exists(l1[0].l2[0].lvl2) as exists_c1, " +
                      "l1[0].l2[0].l3[0].lvl3 as c2, " +
                      "exists(l1[0].l2[0].l3[0].lvl3) as exists_c2, " +
                      "l1[0].l2[0].l3[0].l4[0].lvl4 as c3, " +
                      "exists(l1[0].l2[0].l3[0].l4[0].lvl4) as exists_c3 " +
                      "from `" + typename + '`';
            var statement = _epService.EPAdministrator.CreateEPL(epl);
            var listener  = new SupportUpdateListener();

            statement.AddListener(listener);
            var fields = "c0,exists_c0,c1,exists_c1,c2,exists_c2,c3,exists_c3".SplitCsv();

            foreach (var property in fields)
            {
                Assert.AreEqual(property.StartsWith("exists") ? typeof(bool?) : typeof(int?), TypeHelper.GetBoxedType(statement.EventType.GetPropertyType(property)));
            }

            send.Invoke(_epService, 1, 2, 3, 4);
            var @event = listener.AssertOneGetNewAndReset();

            EPAssertionUtil.AssertProps(@event, fields, new object[] { 1, true, 2, true, 3, true, 4, true });
            SupportEventTypeAssertionUtil.AssertConsistency(@event);

            send.Invoke(_epService, 10, 5, 50, 400);
            EPAssertionUtil.AssertProps(listener.AssertOneGetNewAndReset(), fields, new object[] { 10, true, 5, true, 50, true, 400, true });

            statement.Dispose();
        }
 private void RunAssertion(string typename, FunctionSendEvent4Int send, Type nestedClass, string fragmentTypeName)
 {
     RunAssertionSelectNested(typename, send);
     RunAssertionBeanNav(typename, send);
     RunAssertionTypeValidProp(typename, send, nestedClass, fragmentTypeName);
     RunAssertionTypeInvalidProp(typename);
 }
        private void RunAssertionTypeValidProp(string typeName, FunctionSendEvent4Int send, Type nestedClass, string fragmentTypeName)
        {
            var eventType = _epService.EPAdministrator.Configuration.GetEventType(typeName);

            var expectedType = new object[][] { new object[] { "l1", nestedClass, fragmentTypeName, false } };

            SupportEventTypeAssertionUtil.AssertEventTypeProperties(expectedType, eventType, SupportEventTypeAssertionEnumExtensions.GetSetWithFragment());

            EPAssertionUtil.AssertEqualsAnyOrder(new string[] { "l1" }, eventType.PropertyNames);

            foreach (var prop in Collections.List("l1", "l1.lvl1", "l1.l2", "l1.l2.lvl2"))
            {
                Assert.IsNotNull(eventType.GetGetter(prop));
                Assert.IsTrue(eventType.IsProperty(prop));
            }

            Assert.AreEqual(nestedClass, eventType.GetPropertyType("l1"));
            foreach (var prop in Collections.List("l1.lvl1", "l1.l2.lvl2", "l1.l2.l3.lvl3"))
            {
                Assert.AreEqual(typeof(int?), TypeHelper.GetBoxedType(eventType.GetPropertyType(prop)));
            }

            var lvl1Fragment = eventType.GetFragmentType("l1");

            Assert.IsFalse(lvl1Fragment.IsIndexed);
            Assert.AreEqual(send == FBEAN, lvl1Fragment.IsNative);
            Assert.AreEqual(fragmentTypeName, lvl1Fragment.FragmentType.Name);

            var lvl2Fragment = eventType.GetFragmentType("l1.l2");

            Assert.IsFalse(lvl2Fragment.IsIndexed);
            Assert.AreEqual(send == FBEAN, lvl2Fragment.IsNative);

            Assert.AreEqual(new EventPropertyDescriptor("l1", nestedClass, null, false, false, false, false, true), eventType.GetPropertyDescriptor("l1"));
        }
 private void RunAssertion(
     RegressionEnvironment env,
     string typename,
     FunctionSendEvent4Int send,
     Type nestedClass,
     string fragmentTypeName,
     RegressionPath path)
 {
     RunAssertionSelectNested(env, typename, send, path);
     RunAssertionBeanNav(env, typename, send, path);
     RunAssertionTypeValidProp(env, typename, send, nestedClass, fragmentTypeName);
     RunAssertionTypeInvalidProp(env, typename);
 }
        private void RunAssertionBeanNav(string typename, FunctionSendEvent4Int send)
        {
            var epl       = "select * from " + typename;
            var statement = _epService.EPAdministrator.CreateEPL(epl);
            var listener  = new SupportUpdateListener();

            statement.AddListener(listener);

            send.Invoke(_epService, 1, 2, 3, 4);
            var @event = listener.AssertOneGetNewAndReset();

            EPAssertionUtil.AssertProps(@event, "l1.lvl1,l1.l2.lvl2,l1.l2.l3.lvl3,l1.l2.l3.l4.lvl4".SplitCsv(), new object[] { 1, 2, 3, 4 });
            SupportEventTypeAssertionUtil.AssertConsistency(@event);
            SupportEventTypeAssertionUtil.AssertFragments(@event, typename.Equals(BEAN_TYPENAME), false, "l1,l1.l2,l1.l2.l3,l1.l2.l3.l4");
            RunAssertionEventInvalidProp(@event);

            statement.Dispose();
        }
        private void RunAssertionTypeValidProp(
            RegressionEnvironment env,
            string typeName,
            FunctionSendEvent4Int send,
            Type nestedClass,
            string fragmentTypeName)
        {
            var eventType = env.Runtime.EventTypeService.GetEventTypePreconfigured(typeName);

            var expectedType = new object[][] {
                new object[] { "L1", nestedClass, fragmentTypeName, false }
            };

            SupportEventTypeAssertionUtil.AssertEventTypeProperties(expectedType, eventType, SupportEventTypeAssertionEnumExtensions.GetSetWithFragment());

            EPAssertionUtil.AssertEqualsAnyOrder(new string[] { "L1" }, eventType.PropertyNames);

            foreach (var prop in Arrays.AsList("L1", "L1.Lvl1", "L1.L2", "L1.L2.Lvl2"))
            {
                Assert.IsNotNull(eventType.GetGetter(prop));
                Assert.IsTrue(eventType.IsProperty(prop));
            }

            Assert.AreEqual(nestedClass, eventType.GetPropertyType("L1"));
            foreach (var prop in Arrays.AsList("L1.Lvl1", "L1.L2.Lvl2", "L1.L2.L3.Lvl3"))
            {
                Assert.AreEqual(typeof(int?), eventType.GetPropertyType(prop).GetBoxedType());
            }

            var lvl1Fragment = eventType.GetFragmentType("L1");

            Assert.IsFalse(lvl1Fragment.IsIndexed);
            var isNative = typeName.Equals(BEAN_TYPENAME) || typeName.Equals(JSONPROVIDED_TYPENAME);

            Assert.AreEqual(isNative, lvl1Fragment.IsNative);
            Assert.AreEqual(fragmentTypeName, lvl1Fragment.FragmentType.Name);

            var lvl2Fragment = eventType.GetFragmentType("L1.L2");

            Assert.IsFalse(lvl2Fragment.IsIndexed);
            Assert.AreEqual(isNative, lvl2Fragment.IsNative);

            Assert.AreEqual(new EventPropertyDescriptor("L1", nestedClass, null, false, false, false, false, true), eventType.GetPropertyDescriptor("L1"));
        }
        private void RunAssertionSelectNested(
            RegressionEnvironment env,
            string typename,
            FunctionSendEvent4Int send,
            RegressionPath path)
        {
            var epl =
                "@Name('s0') select " +
                "L1.Lvl1 as c0, " +
                "exists(L1.Lvl1) as exists_c0, " +
                "L1.L2.Lvl2 as c1, " +
                "exists(L1.L2.Lvl2) as exists_c1, " +
                "L1.L2.L3.Lvl3 as c2, " +
                "exists(L1.L2.L3.Lvl3) as exists_c2, " +
                "L1.L2.L3.L4.Lvl4 as c3, " +
                "exists(L1.L2.L3.L4.Lvl4) as exists_c3 " +
                "from " +
                typename;

            env.CompileDeploy(epl, path).AddListener("s0");
            var fields = "c0,exists_c0,c1,exists_c1,c2,exists_c2,c3,exists_c3".SplitCsv();

            var eventType = env.Statement("s0").EventType;

            foreach (var property in fields)
            {
                Assert.AreEqual(property.StartsWith("exists") ? typeof(bool?) : typeof(int?), eventType.GetPropertyType(property).GetBoxedType());
            }

            send.Invoke(typename, env, 1, 2, 3, 4);
            var @event = env.Listener("s0").AssertOneGetNewAndReset();

            EPAssertionUtil.AssertProps(@event, fields, new object[] { 1, true, 2, true, 3, true, 4, true });
            SupportEventTypeAssertionUtil.AssertConsistency(@event);

            send.Invoke(typename, env, 10, 5, 50, 400);
            EPAssertionUtil.AssertProps(env.Listener("s0").AssertOneGetNewAndReset(), fields, new object[] { 10, true, 5, true, 50, true, 400, true });

            env.UndeployModuleContaining("s0");
        }
        private void RunAssertionBeanNav(
            RegressionEnvironment env,
            string typename,
            FunctionSendEvent4Int send,
            RegressionPath path)
        {
            var epl = "@Name('s0') select * from " + typename;

            env.CompileDeploy(epl, path).AddListener("s0");

            send.Invoke(typename, env, 1, 2, 3, 4);
            var @event = env.Listener("s0").AssertOneGetNewAndReset();

            EPAssertionUtil.AssertProps(@event, "L1.Lvl1,L1.L2.Lvl2,L1.L2.L3.Lvl3,L1.L2.L3.L4.Lvl4".SplitCsv(), new object[] { 1, 2, 3, 4 });
            SupportEventTypeAssertionUtil.AssertConsistency(@event);
            var nativeFragment = typename.Equals(BEAN_TYPENAME) || typename.Equals(JSONPROVIDED_TYPENAME);

            SupportEventTypeAssertionUtil.AssertFragments(@event, nativeFragment, false, "L1.L2");
            SupportEventTypeAssertionUtil.AssertFragments(@event, nativeFragment, false, "L1,L1.L2,L1.L2.L3,L1.L2.L3.L4");
            RunAssertionEventInvalidProp(@event);

            env.UndeployModuleContaining("s0");
        }