public void Try1() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add id='1' xml=""<things><add name='deez'/><add name='nutz'/></things>"" /> <add id='2' xml=""<things><add name='got'/><add name='eeee'/></things>"" /> </rows> <fields> <add name='id' type='int' /> <add name='xml' length='max'> <transforms> <add method='fromxml' root='things' xml-mode='all'> <fields> <add name='name' node-type='attribute' /> </fields> </add> </transforms> </add> </fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); var fromXml = new TransformHolder((c) => new Transformalize.Transforms.Xml.FromXmlTransform(c), new Transformalize.Transforms.Xml.FromXmlTransform().GetSignatures()); using (var cfgScope = new ConfigurationContainer(fromXml).CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container(fromXml).CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); Assert.AreEqual(4, output.Length); var name = process.Entities.First().CalculatedFields.First(); var first = output[0]; Assert.AreEqual("deez", first[name]); var second = output[1]; Assert.AreEqual("nutz", second[name]); } } }
public void TestOne() { const string main = @" <cfg name='main'> <connections> <add name='input' provider='sqlserver' database='test' /> <add name='output' provider='sqlserver' database='tflTest' /> </connections> <entities> <add name='e1'> <fields> <add name='pk1' primary-key='true' /> <add name='f1' /> <add name='fk1' /> </fields> </add> <add name='e2'> <fields> <add name='pk2' primary-key='true' /> <add name='f2' /> </fields> </add> </entities> <relationships> <add left-entity='e1' left-field='fk1' right-entity='e2' right-field='pk2' /> </relationships> <calculated-fields> <add name='cf1' t='format({f1} {f2})' /> </calculated-fields> </cfg> "; var logger = new TraceLogger(LogLevel.Debug); using (var scope = new ConfigurationContainer().CreateScope(main, logger, new Dictionary <string, string>(), "@[]")) { var process = scope.Resolve <Process>(); Assert.AreEqual(0, process.Errors().Length); Assert.AreEqual(true, process.CalculatedFields.First().Transforms.First().Method == "format"); var cfp = process.ToCalculatedFieldsProcess(); cfp.Load(); Assert.AreEqual(0, cfp.Errors().Length); Assert.IsTrue(cfp.Entities.First().TryGetField("f1", out var f1), "f1 is not in the calculated entity"); Assert.IsTrue(cfp.Entities.First().TryGetField("f2", out var f2), "f2 is not in the calculated entity"); Console.WriteLine(cfp.Serialize()); } }
public void TestStandardParameter() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Input1='2' Input2='4' Input3='6' /> </rows> <fields> <add name='Input1' /> <add name='Input2' /> <add name='Input3' /> </fields> <calculated-fields> <add name='Value'> <transforms> <add method='format' format='{0} and {1}'> <parameters> <add field='Input1' /> <add field='Input3' /> </parameters> </add> </transforms> </add> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var scope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = scope.Resolve <Process>(); var targetFields = new List <Field> { process.Entities[0].CalculatedFields.First(f => f.Name == "Value") }; var required = process.Entities[0].FindRequiredFields(targetFields, process.Maps); Assert.AreEqual(2, required.Count()); Assert.IsTrue(required.Any(f => f.Name == "Input1")); Assert.IsFalse(required.Any(f => f.Name == "Input2")); Assert.IsTrue(required.Any(f => f.Name == "Input3")); } }
public void TrySubstring() { const string xml = @" <add name='TestDistinct'> <entities> <add name='Dates'> <rows> <add name='dalenewman' /> </rows> <fields> <add name='name' /> </fields> <calculated-fields> <add name='t1' t='copy(name).substring(4)' /> <add name='t2' t='copy(name).substring(4,3)' /> <add name='t3' t='copy(name).substring(4,6)' /> <add name='t4' t='copy(name).substring(4,7)' /> <add name='t5' t='copy(name).substring(10)' /> <add name='t6' t='copy(name).substring(11,1)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { scope.Resolve <IProcessController>().Execute(); var row = process.Entities.First().Rows[0]; Assert.AreEqual("newman", row["t1"], "should skip dale and return newman (the remaining part of the string)"); Assert.AreEqual("new", row["t2"], "should skip dale and return new (3 chars)"); Assert.AreEqual("newman", row["t3"], "should skip dale and return newman (6 characters)"); Assert.AreEqual("newman", row["t4"], "should skip dale and return newman (7 characters, but only 6 available)"); Assert.AreEqual("", row["t5"], "should skip dalenewman and return blank"); Assert.AreEqual("", row["t6"], "should skip more than dalenewman and return blank"); } } }
public void Run() { var logger = new ConsoleLogger(); const string xml = @" <add name='TestProcess' read-only='false'> <entities> <add name='TestData'> <rows> <add number1='1' number2='1.0' /> <add number1='2' number2='2.0' /> </rows> <fields> <add name='number1' type='int' primary-key='true' v='jint(number1 > 1)' help='javascript validation failed' /> <add name='number2' type='double' v='jint(if(number2 > 1.0){ true; } else { number2Message = ""special message""; false; })' /> </fields> </add> </entities> </add>"; using (var outer = new ConfigurationContainer(new JintValidateModule()).CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container(new JintValidateModule()).CreateScope(process, logger)) { var controller = inner.Resolve <IProcessController>(); controller.Execute(); var rows = process.Entities.First().Rows; Assert.AreEqual(false, rows[0]["number1Valid"]); Assert.AreEqual("javascript validation failed|", rows[0]["number1Message"]); Assert.AreEqual(true, rows[1]["number1Valid"]); Assert.AreEqual("", rows[1]["number1Message"]); Assert.AreEqual(false, rows[0]["number2Valid"]); Assert.AreEqual("special message|", rows[0]["number2Message"]); Assert.AreEqual(true, rows[1]["number2Valid"]); Assert.AreEqual("", rows[1]["number2Message"]); } } }
public void TrySomeDateMath() { const string xml = @" <add name='TestDateMath'> <entities> <add name='Dates'> <rows> <add Date='2017-01-01 9 AM' /> <add Date='2016-06-07 12:31:22' /> </rows> <fields> <add name='Date' type='datetime' /> </fields> <calculated-fields> <add name='RoundToMonth' type='datetime' t='copy(Date).dateMath(/M)' /> <add name='AddOneHourOneMinute' type='datetime' t='copy(Date).DateMath(+1h+1m)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); var dateMath = new TransformHolder((c) => new DateMathTransform(c), new DateMathTransform().GetSignatures()); using (var cfgScope = new ConfigurationContainer(dateMath).CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container(dateMath).CreateScope(process, logger)) { scope.Resolve <IProcessController>().Execute(); var row1 = process.Entities.First().Rows[0]; var row2 = process.Entities.First().Rows[1]; Assert.AreEqual(new DateTime(2017, 1, 1, 0, 0, 0), row1["RoundToMonth"]); Assert.AreEqual(new DateTime(2017, 1, 1, 10, 1, 0), row1["AddOneHourOneMinute"]); Assert.AreEqual(new DateTime(2016, 6, 1, 0, 0, 0), row2["RoundToMonth"]); Assert.AreEqual(new DateTime(2016, 6, 7, 13, 32, 22), row2["AddOneHourOneMinute"]); } } }
public void FormatTransformer() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Field1='1' Field2='2' Field3='3' /> </rows> <fields> <add name='Field1' /> <add name='Field2' /> <add name='Field3' type='double' /> </fields> <calculated-fields> <add name='Format' t='copy(Field1,Field2,Field3).format({0}-{1}+{2} ).trim()' /> <add name='BetterFormat' t='format({Field1}-{Field2}+{Field3} ).trim()' /> <add name='FormatRepeats' t='copy(Field1,Field2,Field3).format({0}-{1}+{2}_{1})' /> <add name='BetterFormatRepeats' t='format({Field1}-{Field2}+{Field3}_{Field2})' /> <add name='WithFormat' t='format({Field1:#.0} and {Field3:000.0000})' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); Assert.AreEqual("1-2+3", output[0][process.GetField("Format")]); Assert.AreEqual("1-2+3", output[0][process.GetField("BetterFormat")]); Assert.AreEqual("1-2+3_2", output[0][process.GetField("FormatRepeats")]); Assert.AreEqual("1-2+3_2", output[0][process.GetField("BetterFormatRepeats")]); Assert.AreEqual("1 and 003.0000", output[0][process.GetField("WithFormat")]); } } }
public void AppendWorks() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData' pipeline='linq'> <rows> <add Field1='one' Field2='2' Field3='three' /> </rows> <fields> <add name='Field1' /> <add name='Field2' type='double' /> <add name='Field3' /> </fields> <calculated-fields> <add name='t1' t='copy(Field1).append( is 1)' /> <add name='t2' t='copy(Field2).append( is two)' /> <add name='t3' t='copy(Field3).append(Field2)' /> <add name='t4' t='copy(Field3).append(t3)' /> <add name='t5' t='copy(Field1).append()' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); var cf = process.Entities.First().CalculatedFields.ToArray(); Assert.AreEqual("one is 1", output[0][cf[0]]); Assert.AreEqual("2 is two", output[0][cf[1]]); Assert.AreEqual("three2", output[0][cf[2]]); Assert.AreEqual("threethree2", output[0][cf[3]]); } } }
public void Match() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData' pipeline='linq'> <rows> <add Field1='Local/3114@tolocalext-fc5d,1' /> <add Field1='SIP/Generic-Vitel_Outbound-0002b45a' /> </rows> <fields> <add name='Field1' /> <add name='Field2' /> </fields> <calculated-fields> <add name='MatchField1' t='copy(Field1).match(3[0-9]{3}(?=@))' default='None' /> <add name='MatchAnyField' t='copy(Field1,Field2).match(3[0-9]{3}(?=@))' default='None' /> <add name='MatchCount' type='int' t='copy(Field1).matchCount(Vitel)' /> <add name='Matching' t='copy(Field1).matching([0-9a-zA-Z])' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(); using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container().CreateScope(process, logger)) { var output = inner.Resolve <IProcessController>().Read().ToArray(); var cf = process.Entities.First().CalculatedFields.ToArray(); Assert.AreEqual("3114", output[0][cf[0]]); Assert.AreEqual("3114", output[0][cf[1]]); Assert.AreEqual("None", output[1][cf[0]]); Assert.AreEqual("None", output[1][cf[1]]); Assert.AreEqual(1, output[1][cf[2]]); Assert.AreEqual("Local3114tolocalextfc5d1", output[0][cf[3]]); } } }
public void Run() { var logger = new ConsoleLogger(LogLevel.Debug); var xml = @" <add name='Test' read-only='true'> <scripts> <add name='s1' file='scripts\script.js' /> </scripts> <entities> <add name='Data'> <rows> <add number1='1' number2='1.0' /> <add number1='2' number2='2.0' /> <add number1='3' number2='3.0' /> </rows> <fields> <add name='number1' type='int' primary-key='true' /> <add name='number2' type='double' /> </fields> <calculated-fields> <add name='scripted' type='double' t='jint(s1)' /> </calculated-fields> </add> </entities> </add>"; using (var outer = new ConfigurationContainer(new JintTransformModule()).CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container(new JintTransformModule()).CreateScope(process, new ConsoleLogger(LogLevel.Debug))) { var controller = inner.Resolve <IProcessController>(); controller.Execute(); var rows = process.Entities.First().Rows; Assert.AreEqual(-1.0, rows[0]["scripted"]); Assert.AreEqual(4.0, rows[1]["scripted"]); Assert.AreEqual(9.0, rows[2]["scripted"]); } } }
public void AnyWorks() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData' pipeline='linq'> <rows> <add Field1='1' Field2='2' Field3='3' /> </rows> <fields> <add name='Field1' /> <add name='Field2' /> <add name='Field3' /> </fields> <calculated-fields> <add name='Has1' type='bool' t='copy(*).any(1)' /> <add name='Has2' type='bool' t='copy(Field1,Field2,Field3).any(2)' /> <add name='Has3' type='bool' t='copy(*).any(3)' /> <add name='Has4' type='bool' t='copy(Field1,Field2,Field3).any(4)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); var cf = process.Entities.First().CalculatedFields.ToArray(); Assert.AreEqual(true, output[0][cf[0]]); Assert.AreEqual(true, output[0][cf[1]]); Assert.AreEqual(true, output[0][cf[2]]); Assert.AreEqual(false, output[0][cf[3]]); } } }
public void TryIt() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Field1='11' Field2='12' Field3='13' /> <add Field1='xx' Field2='' Field3='100.8' /> </rows> <fields> <add name='Field1' v='contains(1)' message-field='Message' /> <add name='Field2' v='required().is(int)' message-field='Message' /> <add name='Field3' v='matches(^[0-9/.]{5}$)' message-field='Message' help='Field3 must be a 5 digit number (including decimal pt.)' /> </fields> <calculated-fields> <add name='Message' length='1000' default='' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container().CreateScope(process, logger)) { var controller = inner.Resolve <IProcessController>(); var output = controller.Read().ToArray(); var message = process.Entities.First().CalculatedFields.First(cf => cf.Name == "Message"); var valid = process.Entities.First().CalculatedFields.First(cf => cf.Name == "TestDataValid"); Assert.IsFalse((bool)output[0][valid]); Assert.AreEqual("Field3 must be a 5 digit number (including decimal pt.)", output[0][message].ToString().Replace("|", " ").TrimEnd()); Assert.AreEqual("Field1 must contain 1. Field2 is required. Field2's value is incompatable with the int data type.", output[1][message].ToString().Replace("|", " ").TrimEnd()); } } }
public void LengthOfArrays() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Input='1 2 3 4' /> </rows> <fields> <add name='Input' /> </fields> <calculated-fields> <add name='Length' type='int' t='copy(Input).split( ).length()' /> <add name='Len' type='int' t='copy(Input).split( ).len()' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); var transforms = new List <TransformHolder>() { new TransformHolder((c) => new LengthTransform(c), new LengthTransform().GetSignatures()), new TransformHolder((c) => new SplitTransform(c), new SplitTransform().GetSignatures()) }.ToArray(); using (var cfgScope = new ConfigurationContainer(transforms).CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container(transforms).CreateScope(process, logger)) { scope.Resolve <IProcessController>().Execute(); var output = process.Entities.First().Rows; Assert.AreEqual(4, output[0]["Len"]); Assert.AreEqual(4, output[0]["Length"]); } } }
public void TryDistinct() { const string xml = @" <add name='TestDistinct'> <connections> <add name='input' provider='internal' /> <add name='output' provider='internal' /> </connections> <entities> <add name='Dates'> <rows> <add Words='One Two Three One' /> <add Words='111-222-3333 222-333-4444' /> </rows> <fields> <add name='Words' /> </fields> <calculated-fields> <add name='DistinctWords' t='copy(Words).split( ).distinct().join( )' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { scope.Resolve <IProcessController>().Execute(); var row1 = process.Entities.First().Rows[0]; var row2 = process.Entities.First().Rows[1]; Assert.AreEqual("One Two Three", row1["DistinctWords"]); Assert.AreEqual("111-222-3333 222-333-4444", row2["DistinctWords"]); } } }
public void TestIssue1() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Pile='1Stories: 2Installed on: 09/14/2016 FSO: scpActual Appoi' /> </rows> <fields> <add name='Pile' length='max'/> </fields> <calculated-fields> <add name='WithShorthand' t='copy(Pile).tolower().matching(installed on:\s*\d{1,2}\/\d{1,2}\/\d{2,4})' /> <add name='WithLonghand'> <transforms> <add method='copy' value='Pile' /> <add method='tolower' /> <add method='matching' pattern='installed on:\s*\d{1,2}\/\d{1,2}\/\d{2,4}' /> </transforms> </add> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(); using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container().CreateScope(process, logger)) { var row = inner.Resolve <IProcessController>().Read().ToArray()[0]; var withShorthand = process.Entities[0].CalculatedFields[0]; var withLonghand = process.Entities[0].CalculatedFields[1]; Assert.AreEqual("installed on: 09/14/2016", row[withShorthand]); Assert.AreEqual("installed on: 09/14/2016", row[withLonghand]); } } }
public void DatePart1() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData' > <rows> <add StartDate='2016-06-01' EndDate='2016-08-01' /> </rows> <fields> <add name='StartDate' type='datetime' /> <add name='EndDate' type='datetime' /> </fields> <calculated-fields> <add name='StartYear' type='int' t='copy(StartDate).datepart(year)' /> <add name='EndYear' type='int' t='copy(EndDate).datepart(year)' /> <add name='StartWeek' type='int' t='copy(StartDate).datepart(weekofyear)' /> <add name='EndWeek' type='int' t='copy(EndDate).datepart(weekofyear)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); var cf = process.Entities.First().CalculatedFields.ToArray(); Assert.AreEqual(2016, output[0][cf[0]]); Assert.AreEqual(2016, output[0][cf[1]]); Assert.AreEqual(23, output[0][cf[2]]); Assert.AreEqual(32, output[0][cf[3]]); } } }
public void TryIt() { const string xml = @" <add name='TestProcess'> <connections> <add name='input' provider='internal' /> <add name='output' provider='internal' /> </connections> <entities> <add name='TestData'> <rows> <add input=' Wave 1' /> <add input='Flight 1' /> </rows> <fields> <add name='input' t='trim()' /> </fields> <calculated-fields> <add name='output' type='bool' t='copy(input).startsWith(W)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); Assert.AreEqual(true, output[0][process.GetField("output")]); Assert.AreEqual(false, output[1][process.GetField("output")]); } } }
public void DateDiff1() { var xml = @" <add name='TestProcess'> <entities> <add name='TestData' > <rows> <add StartDate='2016-06-01' EndDate='2016-08-01' /> </rows> <fields> <add name='StartDate' type='datetime' /> <add name='EndDate' type='datetime' /> </fields> <calculated-fields> <add name='Years' type='int' t='copy(StartDate,EndDate).datediff(year)' /> <add name='Days' type='int' t='copy(StartDate,EndDate).datediff(day)' /> <add name='Minutes' type='int' t='copy(StartDate,EndDate).datediff(minute)' /> <add name='Hours' type='double' t='copy(StartDate,EndDate).datediff(hour)' /> </calculated-fields> </add> </entities> </add> ".Replace('\'', '"'); var transform = new TransformHolder((c) => new DateDiffTransform(c), new DateDiffTransform().GetSignatures()); using (var outer = new ConfigurationContainer(transform).CreateScope(xml, new DebugLogger())) { var process = outer.Resolve <Process>(); using (var inner = new Container(transform).CreateScope(process, new DebugLogger())) { var output = inner.Resolve <IProcessController>().Read().ToArray(); var cf = process.Entities.First().CalculatedFields.ToArray(); Assert.AreEqual(0, output[0][cf[0]]); Assert.AreEqual(61, output[0][cf[1]]); Assert.AreEqual(87840, output[0][cf[2]]); Assert.AreEqual(1464d, output[0][cf[3]]); } } }
public void Join() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Input1='2' Input2='4' Input3='6' /> </rows> <fields> <add name='Input1' /> <add name='Input2' /> <add name='Input3' /> </fields> <calculated-fields> <add name='Joined' t='copy(Input1,Input2,Input3).toArray().join(-)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); var transforms = new List <TransformHolder>() { new TransformHolder((c) => new JoinTransform(c), new JoinTransform().GetSignatures()), new TransformHolder((c) => new ToArrayTransform(c), new ToArrayTransform().GetSignatures()) }.ToArray(); using (var cfgScope = new ConfigurationContainer(transforms).CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container(transforms).CreateScope(process, logger)) { scope.Resolve <IProcessController>().Execute(); var output = process.Entities.First().Rows; Assert.AreEqual("2-4-6", output[0]["Joined"]); } } }
public void Tag() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData' pipeline='linq'> <rows> <add Field1='1' /> <add Field1='5' /> </rows> <fields> <add name='Field1' /> </fields> <calculated-fields> <add name='span' t='copy(Field1).tag(span)' /> <add name='div' t='copy(Field1).tag(div,class:fun)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); var cf = process.Entities.First().CalculatedFields.ToArray(); Assert.AreEqual("<span>1</span>", output[0][cf[0]]); Assert.AreEqual("<div class=\"fun\">1</div>", output[0][cf[1]]); Assert.AreEqual("<span>5</span>", output[1][cf[0]]); Assert.AreEqual("<div class=\"fun\">5</div>", output[1][cf[1]]); } } }
public void In() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData' pipeline='linq'> <rows> <add Field1='1' /> <add Field1='5' /> </rows> <fields> <add name='Field1' /> </fields> <calculated-fields> <add name='In123' type='bool' t='copy(Field1).in(1,2,3)' /> <add name='In456' type='bool' t='copy(Field1).in(4,5,6)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); var cf = process.Entities.First().CalculatedFields.ToArray(); Assert.AreEqual(true, output[0][cf[0]]); Assert.AreEqual(false, output[0][cf[1]]); Assert.AreEqual(false, output[1][cf[0]]); Assert.AreEqual(true, output[1][cf[1]]); } } }
public void EqualsValidator() { var xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Field1='11' Field2='12' Field3='13' /> <add Field1='11' Field2='11' Field3='11' /> </rows> <fields> <add name='Field1' /> <add name='Field2' /> <add name='Field3' /> </fields> <calculated-fields> <add name='AreEqual' type='bool' t='copy(Field1,Field2,Field3).equals()' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) { var process = cfgScope.Resolve <Process>(); using (var scope = new Container().CreateScope(process, logger)) { var output = scope.Resolve <IProcessController>().Read().ToArray(); Assert.AreEqual(false, output[0][process.GetField("AreEqual")]); Assert.AreEqual(true, output[1][process.GetField("AreEqual")]); } } }
public void MakeSureTimeIsntChanging() { var xml = @" <add name='TestProcess'> <entities> <add name='TestData' > <rows> <add Date='2019-05-05 1:05 PM' /> </rows> <fields> <add name='Date' type='datetime' /> </fields> <calculated-fields> <add name='DateDefault' type='datetime' default='2019-05-05 1:07 PM' /> <add name='DateWithZ' type='datetime' default='2019-05-05 1:08 PM Z' /> <add name='DateWithOffSet' type='datetime' default='2019-05-05 1:09 PM +00:00' /> <add name='DateWithOffSet4' type='datetime' default='2019-05-05 1:09 PM -04:00' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container().CreateScope(process, logger)) { inner.Resolve <IProcessController>().Execute(); var row = process.Entities.First().Rows.First(); Assert.AreEqual(new DateTime(2019, 5, 5, 13, 5, 0), row["Date"]); Assert.AreEqual(new DateTime(2019, 5, 5, 13, 7, 0), row["DateDefault"]); Assert.AreEqual(new DateTime(2019, 5, 5, 13, 8, 0), row["DateWithZ"]); Assert.AreEqual(new DateTime(2019, 5, 5, 13, 9, 0), row["DateWithOffSet"]); Assert.AreEqual(new DateTime(2019, 5, 5, 17, 9, 0), row["DateWithOffSet4"]); } } }
public void Test() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add Date='2019-07-01 10:30 AM' /> </rows> <fields> <add name='Date' type='datetime'/> </fields> <calculated-fields> <add name='Milliseconds' type='long' t='copy(Date).timezone(Eastern Standard Time,UTC).tounixtime(ms)' /> <add name='Seconds' type='long' t='copy(Date).timezone(Eastern Standard Time,UTC).tounixtime(seconds)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); var specifyKind = new TransformHolder((c) => new TimeZoneTransform(c), new TimeZoneTransform().GetSignatures()); var toUnixTime = new TransformHolder((c) => new ToUnixTimeTransform(c), new ToUnixTimeTransform().GetSignatures()); using (var outer = new ConfigurationContainer(new[] { specifyKind, toUnixTime }).CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container(new[] { specifyKind, toUnixTime }).CreateScope(process, logger)) { var controller = inner.Resolve <IProcessController>(); var output = controller.Read().ToArray(); var milliseconds = (long)output[0][process.Entities.First().CalculatedFields.First()]; var seconds = (long)output[0][process.Entities.First().CalculatedFields.Last()]; Assert.AreEqual(1561991400000, milliseconds); Assert.AreEqual(1561991400, seconds); } } }
public void Condense() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData' pipeline='linq'> <rows> <add Field1='Some duplicates spa ces' /> <add Field1='O n e S p a c ee' /> </rows> <fields> <add name='Field1' /> </fields> <calculated-fields> <add name='CondenseField1' t='copy(Field1).condense()' /> <add name='DuplicateE' t='copy(Field1).condense(e)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var outer = new ConfigurationContainer().CreateScope(xml, logger, null, "@()")) { var process = outer.Resolve <Process>(); using (var inner = new Container().CreateScope(process, logger)) { var results = inner.Resolve <IProcessController>().Read().ToArray(); var condensed = process.Entities.First().CalculatedFields.First(); var duplicate = process.Entities.First().CalculatedFields.Last(); Assert.AreEqual("Some duplicates spa ces", results[0][condensed]); Assert.AreEqual("O n e S p a c ee", results[1][condensed]); Assert.AreEqual("O n e S p a c e", results[1][duplicate]); } } }
public void Try() { var xml = @" <add name='TestProcess'> <entities> <add name='TestData' > <rows> <add Date1='2019-05-05 1:05 PM' Date2='2019-05-05 1:05 PM' Date3='2019-05-05 1:05 PM' Date4='2019-05-05 1:05 PM' Date5='2019-05-05T13:05:00Z' /> </rows> <fields> <add name='Date1' type='datetime' t='specifyKind(unspecified)' /> <add name='Date2' type='datetime' t='specifyKind(local)' /> <add name='Date3' type='datetime' t='specifyKind(utc)' /> <add name='Date4' type='datetime' /> <add name='Date5' type='datetime' /> </fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); var transform = new TransformHolder((c) => new SpecifyKindTransform(c), new SpecifyKindTransform().GetSignatures()); using (var outer = new ConfigurationContainer(transform).CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container(transform).CreateScope(process, logger)) { inner.Resolve <IProcessController>().Execute(); var row = process.Entities.First().Rows.First(); Assert.AreEqual(DateTimeKind.Unspecified, ((DateTime)row["Date1"]).Kind); Assert.AreEqual(DateTimeKind.Local, ((DateTime)row["Date2"]).Kind); Assert.AreEqual(DateTimeKind.Utc, ((DateTime)row["Date3"]).Kind); Assert.AreEqual(DateTimeKind.Unspecified, ((DateTime)row["Date4"]).Kind); Assert.AreEqual(DateTimeKind.Utc, ((DateTime)row["Date5"]).Kind); } } }
public void ToTime() { const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add intField='238' longField='500' /> </rows> <fields> <add name='intField' type='int' /> <add name='longField' type='long' /> </fields> <calculated-fields> <add name='intFieldToTime' t='copy(intField).toTime(hour)' /> <add name='longFieldToTime' t='copy(longField).toTime(seconds)' /> </calculated-fields> </add> </entities> </add>"; var logger = new ConsoleLogger(LogLevel.Debug); using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); using (var inner = new Container().CreateScope(process, logger)) { var results = inner.Resolve <IProcessController>().Read().ToArray(); var intFieldToTime = process.Entities[0].CalculatedFields[0]; var longFieldToTime = process.Entities[0].CalculatedFields[1]; Assert.AreEqual("9.22:00:00", results[0][intFieldToTime]); Assert.AreEqual("00:08:20", results[0][longFieldToTime]); } } }
public void Run() { var logger = new ConsoleLogger(); const string xml = @" <add name='TestProcess'> <entities> <add name='TestData'> <rows> <add id='1' store='Walmart' other='' /> <add id='2' store='Target' other='' /> <add id='3' store='Other' other='' /> <add id='4' store='Other' other='Costco' /> </rows> <fields> <add name='id' type='int' primary-key='true' /> <add name='store' /> <add name='other' v=""jint( if(store === 'Other' && other === '') { otherMessage = 'other is required'; false; } else { true; } )""/> </fields> <calculated-fields> </calculated-fields> </add> </entities> </add>"; using (var outer = new ConfigurationContainer(new JintValidateModule()).CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); if (process.Errors().Any()) { foreach (var error in process.Errors()) { System.Console.WriteLine(error); } return; } using (var inner = new Container(new JintValidateModule()).CreateScope(process, logger)) { var controller = inner.Resolve <IProcessController>(); controller.Execute(); var rows = process.Entities.First().Rows; Assert.AreEqual(true, rows[0]["otherValid"]); Assert.AreEqual("", rows[0]["otherMessage"]); Assert.AreEqual(true, rows[1]["otherValid"]); Assert.AreEqual("", rows[1]["otherMessage"]); Assert.AreEqual(false, rows[2]["otherValid"]); Assert.AreEqual("other is required|", rows[2]["otherMessage"]); Assert.AreEqual(true, rows[3]["otherValid"]); Assert.AreEqual("", rows[3]["otherMessage"]); } } }
public void Run() { var logger = new ConsoleLogger(); const string xml = @" <add name='TestProcess'> <maps> <add name='map'> <items> <add from='1' to='One' /> <add from='2' to='Two' /> <add from='3' to='Three' /> </items> </add> </maps> <entities> <add name='TestData'> <rows> <add number1='1' /> <add number1='2' /> <add number1='4' /> </rows> <fields> <add name='number1' type='int' primary-key='true'> <validators> <add method='jint' script=""var x = number1+'' in map; if(x) { number1Message = map[number1];} else { number1Message = number1 + ' does not exist'}; x;"" /> </validators> </add> </fields> </add> </entities> </add>"; using (var outer = new ConfigurationContainer(new JintValidateModule()).CreateScope(xml, logger)) { var process = outer.Resolve <Process>(); if (process.Errors().Any()) { foreach (var error in process.Errors()) { System.Console.WriteLine(error); } return; } using (var inner = new Container(new JintValidateModule()).CreateScope(process, logger)) { var controller = inner.Resolve <IProcessController>(); controller.Execute(); var rows = process.Entities.First().Rows; Assert.AreEqual(true, rows[0]["number1Valid"]); Assert.AreEqual("", rows[0]["number1Message"]); Assert.AreEqual(true, rows[1]["number1Valid"]); Assert.AreEqual("", rows[1]["number1Message"]); Assert.AreEqual(false, rows[2]["number1Valid"]); Assert.AreEqual("4 does not exist|", rows[2]["number1Message"]); } } }