public void CreateX12Segment_NoElements_CorrectSegmentCreated()
        {
            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                      KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("I_num", 243, _typeDefs) };
            var rec = new KeyValRecord(items, 12, 3, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var x12Seg = rec.CreateEmptyX12Segment("LX", 0); //not really practical to have a segment with no elements

            //assert
            x12Seg.Should().NotBeSameAs(rec);
            x12Seg.Count.Should().Be(1); // 1 + 4
            x12Seg.RecNo.Should().Be(12);
            x12Seg.SourceNo.Should().Be(3);
            x12Seg.Keys.Count.Should().Be(1);
            x12Seg.Items.Count.Should().Be(1);

            x12Seg[0].Should().Be("LX");
            x12Seg["Segment"].Should().Be("LX");
            x12Seg.Keys[0].Should().Be("Segment");
            x12Seg[1].Should().BeNull();
            x12Seg["Elem001"].Should().BeNull();
            //x12Seg.Keys[5].Should().BeNull(); - this throws ArgumentOutOfRangeException
        }
Example #2
0
        public void ConstructRecordWithDupKey_WithinThresholdIgnoreDups_WarningLogged()
        {
            //This is really an integration test

            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("Fld1", "71941", _typeDefs),
                                      KeyValItem.CreateItem("Fld2", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("Fld1", 243, _typeDefs) }; //this field has the same key as the first field
            int recNo = 25;

            //act
            var logger = (MockLogger)_config.Logger;
            var rec    = new KeyValRecord(items, recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //assert
            //   Item1=severity, Item2=message (evaluated by logger), Item3=entire log entry (passed through by logger)
            logger.Results.Count.Should().Be(3); //incl. Log Title Box and "Configuration initialized." entry
            var result = logger.Results[2];

            result.Item1.Should().Be(LogEntrySeverity.Warning);
            result.Item2.Contains("Duplicate key in field #3 of record #25:").Should().BeTrue(); //text from KeyValRecord class
            result.Item2.Contains("Item containing value of '243' has been ignored.").Should().BeTrue();
            var entry = result.Item3;

            result.Item2.Should().Be(entry.MessageOnDemand()); //this confirms that timestamp in a message is from a time of LogInfo method
            entry.Severity.Should().Be(LogEntrySeverity.Warning);
            entry.MessageOnDemand.Should().BeOfType(typeof(Func <string>));
            entry.Exception.Should().BeNull();
            var msg = result.Item3.MessageOnDemand(); //evaluate message on demand one more time

            msg.Contains("Duplicate key in field #3 of record #25:").Should().BeTrue();
            msg.Contains("Item containing value of '243' has been ignored.").Should().BeTrue();
            msg.Should().Be(entry.MessageOnDemand()); //this confirms again that timestamp in a message is from a time of LogInfo method
        }
        public void GetItemClone_NewTypedValue_CorrectData()
        {
            //arrange
            var item  = KeyValItem.CreateItem("I_fld", 156, _typeDefs);
            var items = new IItem[] { item };
            int recNo = 14;
            var rec   = new KeyValRecord(items, recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var clone = rec.GetItemClone(item, 3);

            //assert
            clone.Should().NotBeSameAs(item);
            clone.Should().BeOfType(typeof(KeyValItem <int>));
            clone.ItemDef.Type.Should().Be(ItemType.Int);
            clone.Key.Should().Be("I_fld");
            clone.Value.Should().Be(3);

            //act2
            clone = rec.GetItemClone(item, "4");

            //assert2
            clone.Should().NotBeSameAs(item);
            clone.Should().BeOfType(typeof(KeyValItem <int>));
            clone.ItemDef.Type.Should().Be(ItemType.Int);
            clone.Key.Should().Be("I_fld");
            clone.Value.Should().Be(4);
        }
        public void GetEmptyClone_SimpleValues_SameRecNoButEmptyData()
        {
            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                      KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("I_num", 243, _typeDefs) };
            var rec = new KeyValRecord(items, 12, 11, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var     clone  = rec.GetEmptyClone();
            var     cloneR = (IRecord)clone; //this is no different, both clone and cloneR are of type IRecord
            var     cloneU = (IUntypedRecord)clone;
            dynamic cloneD = clone;          //n/a as there are no dynamic properties in this case

            //assert
            clone.Should().NotBeSameAs(rec);
            clone.Count.Should().Be(0);
            clone.RecNo.Should().Be(12);
            clone.SourceNo.Should().Be(11);
            clone.Keys.Count.Should().Be(0);
            clone.Items.Count.Should().Be(0);
            clone[0].Should().BeNull();
            clone["any"].Should().BeNull();
            cloneR[0].Should().BeNull();
            cloneR["any"].Should().BeNull();
            cloneU[0].Should().BeNull();
            cloneU["any"].Should().BeNull();
        }
Example #5
0
        public void GetEmptyClone_DisallowAlterFields_EmptyData()
        {
            //arrange
            var items1 = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                       KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                       KeyValItem.CreateItem("I_num", 243, _typeDefs) };

            var items2 = new IItem[] { KeyValItem.CreateItem("I_#", 15, _typeDefs),
                                       KeyValItem.CreateItem("Fld1", "data1", _typeDefs) };

            var recs = new KeyValRecord[] { new KeyValRecord(items1, 16, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem),
                                            new KeyValRecord(items2, 17, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem) };

            _config.AllowTransformToAlterFields = false;                                           //it was set to true in test Initialize method
            var cluster = new KeyValCluster(recs, 9, 16, 1, null, null, _typeDefs, _config, null); //clstr# 9 starting at rec# 16; AllowTransformToAlterFields is false

            //act
            var clone = cluster.GetEmptyClone();

            //assert
            clone.Count.Should().Be(0);
            clone.ClstrNo.Should().Be(9);
            clone.StartRecNo.Should().Be(16);

            clone.Records.Count.Should().Be(0);

            clone.GetRecord(0).Should().BeNull();
        }
        public void KvRecCtor_NoItems_CorrectData()
        {
            //arrange
            var items = new List <IItem>();
            int recNo = 22;
            int srcNo = 4;

            //act
            var            rec  = new KeyValRecord(items, recNo, srcNo, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);
            var            recR = (IRecord)rec;
            IUntypedRecord recU = rec;
            dynamic        recD = rec; //n/a as there are no dynamic properties in this case

            //assert
            rec.Count.Should().Be(0);
            rec.RecNo.Should().Be(recNo);
            rec.SourceNo.Should().Be(srcNo);
            rec.Keys.Count.Should().Be(0);
            rec.Items.Count.Should().Be(0);
            rec[0].Should().BeNull();
            rec["any"].Should().BeNull();
            recR[0].Should().BeNull();
            recR["any"].Should().BeNull();
            recU[0].Should().BeNull();
            recU["any"].Should().BeNull();
        }
Example #7
0
        public void AddItem_SampleValue_ReturnAddedItem()
        {
            //arrange
            IUntypedRecord rec = new KeyValRecord(_items, _recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var result = rec.AddItem("I_someNum", "360");

            //assert
            result.Should().BeOfType(typeof(KeyValItem <int>));
            result.Key.Should().Be("I_someNum");
            result.Value.Should().Be(360);
            result.ItemDef.Type.Should().Be(ItemType.Int);

            rec.Count.Should().Be(5);
            rec.RecNo.Should().Be(26);

            rec[0].Should().BeOfType(typeof(string));
            rec[0].Should().Be("71941");
            rec[3].Should().BeOfType(typeof(string));
            rec[3].Should().Be("184");
            rec[4].Should().BeOfType(typeof(string));
            rec[4].Should().Be("360");
            rec.Keys[4].Should().Be("I_someNum");
        }
Example #8
0
        public void Initialize()
        {
            _config = new OrchestratorConfig();
            _config.AllowTransformToAlterFields = true;
            _config.PropertyBinEntities         = PropertyBinAttachedTo.Clusters;

            // simple type definitions, everything string, except for fields starting with I_ (int)
            Func <string, ItemType> fldTypeFunc = key => key.StartsWith("I_") ? ItemType.Int : ItemType.String;
            var initFldTypes = new ConcurrentDictionary <string, ItemType>();
            Func <string, string> fldFormatFunc = key => string.Empty;
            var initFldFormats = new ConcurrentDictionary <string, string>();

            _typeDefs = new TypeDefinitions(fldTypeFunc, initFldTypes, fldFormatFunc, initFldFormats);

            var items1 = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                       KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                       KeyValItem.CreateItem("I_num", 243, _typeDefs) };

            var items2 = new IItem[] { KeyValItem.CreateItem("I_#", 15, _typeDefs),
                                       KeyValItem.CreateItem("Fld1", "data1", _typeDefs) };

            var recs = new KeyValRecord[] { new KeyValRecord(items1, 16, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem),
                                            new KeyValRecord(items2, 17, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem) };

            _cluster = new KeyValCluster(recs, 9, 16, 1, null, new Dictionary <string, object>(), _typeDefs, _config, null); //clstr# 9 starting at rec# 16; AllowTransformToAlterFields is true
        }
 /// <summary>
 /// Extract tokens defined in ArbitraryOutputDefs from output record
 /// </summary>
 /// <param name="outputRecord"></param>
 /// <returns></returns>
 internal override IEnumerable <IItem> ItemsToOutput(KeyValRecord outputRecord)
 {
     foreach (var key in _outputKeys)
     {
         yield return(key == null ? _voidItem : (IItem)outputRecord.GetItem(key));
     }
 }
        public void GetEmptyClone_DisallowAlterFields_SameRecNoButEmptyData()
        {
            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                      KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("I_num", 243, _typeDefs) };

            _config.AllowTransformToAlterFields = false; //it was set to true in test Initialize method
            var rec = new KeyValRecord(items, 16, 7, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var clone  = rec.GetEmptyClone(); //note that this clone is unmaintainable (i.e. it will stay empty forever)
            var cloneR = (IRecord)clone;
            var cloneU = (IUntypedRecord)clone;

            //assert
            clone.Should().NotBeSameAs(rec);
            clone.Count.Should().Be(0);
            clone.RecNo.Should().Be(16);
            clone.SourceNo.Should().Be(7);
            clone.Keys.Count.Should().Be(0);
            clone.Items.Count.Should().Be(0);
            clone[0].Should().BeNull();
            clone["any"].Should().BeNull();
            cloneR[0].Should().BeNull();
            cloneR["any"].Should().BeNull();
            cloneU[0].Should().BeNull();
            cloneU["any"].Should().BeNull();
        }
        public void AssignValue_TypedValueSetToStringItem_ConvertedToString()
        {
            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("blah", "origData", _typeDefs),
                                      KeyValItem.CreateItem("I_int", 33, _typeDefs) };
            var            rec  = new KeyValRecord(items, 16, 2, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);
            var            recR = (IRecord)rec;
            IUntypedRecord recU = rec;
            dynamic        recD = rec;

            //act
            rec["blah"] = true;

            //assert
            rec.Count.Should().Be(2);
            rec.RecNo.Should().Be(16);
            rec.SourceNo.Should().Be(2);
            rec.Keys[0].Should().Be("blah");
            rec[0].Should().Be("True");

            //act2
            recR["blah"] = new DateTime(2050, 12, 1);

            //assert2
            rec.Count.Should().Be(2);
            rec.RecNo.Should().Be(16);
            rec.SourceNo.Should().Be(2);
            rec.Keys[0].Should().Be("blah");
            rec[0].Should().Be("12/1/2050 12:00:00 AM");
        }
Example #12
0
 /// <summary>
 /// Provide a list of items to include in output based on FieldsToUse (insignificant, trailing items may be removed based on ExcludeExtranousFields setting)
 /// </summary>
 /// <param name="outputRecord"></param>
 /// <returns></returns>
 internal override IEnumerable <IItem> ItemsToOutput(KeyValRecord outputRecord)
 {
     if (_config.ExcludeExtraneousFields)
     {
         //remove trailing, empty fields
         return(base.ItemsFromFieldsToUse(outputRecord).Reverse().SkipWhile(itm => string.IsNullOrEmpty(itm.StringValue)).Reverse());
     }
     return(base.ItemsFromFieldsToUse(outputRecord));
 }
Example #13
0
 /// <summary>
 /// If no OutputFields specified, simply include all items in the record.
 /// If OutputFields are present, they drive items on output, possibly resulting in void items (if not present in the record).
 /// </summary>
 /// <param name="outputRecord"></param>
 /// <returns></returns>
 internal override IEnumerable <IItem> ItemsToOutput(KeyValRecord outputRecord)
 {
     if (_config.OutputFields == null)
     {
         return(outputRecord.Items);
     }
     //here, output is driven by OutputFields, i.e. FieldsToUse
     return(base.ItemsFromFieldsToUse(outputRecord));
 }
        public void RoClstrCtor_SimpleValuesThrowOnMisuse_UnsupportedThrows()
        {
            //arrange
            var items1 = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                       KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                       KeyValItem.CreateItem("I_num", 243, _typeDefs) };

            var items2 = new IItem[] { KeyValItem.CreateItem("I_#", 15, _typeDefs),
                                       KeyValItem.CreateItem("Fld1", "data1", _typeDefs) };

            var recs = new KeyValRecord[] { new KeyValRecord(items1, 16, 7, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem),
                                            new KeyValRecord(items2, 17, 8, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem) };

            //act
            var clstr = new KeyValCluster(recs, 9, 16, 78, null, null, _typeDefs, _config, null); //clstr# 9 starting at rec# 16; AllowTransformToAlterFields is true
                                                                                                  // note that startSourceNo 78 does not match the 1st record (7) - not a real scenario, but a good text
            var roClstr = new ReadOnlyCluster(clstr, true);                                       //this ctor causes objReadOnlyCluster to throw NotSupportedexception on misuse

            //assert
            roClstr.Count.Should().Be(2);
            roClstr.ClstrNo.Should().Be(9);
            roClstr.StartRecNo.Should().Be(16);
            roClstr.StartSourceNo.Should().Be(78);

            roClstr.Records.Count.Should().Be(2);

            Action a = () => { roClstr[0] = null; };

            a.Should().Throw <NotSupportedException>().WithMessage("Unsupported operation invoked on ReadOnlyCluster object.");
            roClstr[0].Should().NotBeNull();
            a = () => { roClstr.RemoveRecord(0); };
            a.Should().Throw <NotSupportedException>().WithMessage("Unsupported operation invoked on ReadOnlyCluster object.");
            roClstr.Count.Should().Be(2);
            roClstr.Records.Count.Should().Be(2);
            a = () => { roClstr.AddRecord(null); };
            a.Should().Throw <NotSupportedException>().WithMessage("Unsupported operation invoked on ReadOnlyCluster object.");
            roClstr.Count.Should().Be(2);
            roClstr.Records.Count.Should().Be(2);
            a = () => { roClstr.GetClone(); };
            a.Should().Throw <NotSupportedException>().WithMessage("Unsupported operation invoked on ReadOnlyCluster object.");
            a = () => { roClstr.GetEmptyClone(); };
            a.Should().Throw <NotSupportedException>().WithMessage("Unsupported operation invoked on ReadOnlyCluster object.");

            var roRec = roClstr[0];

            roRec.Should().BeOfType <ReadOnlyRecord>();
            a = () => { roRec.RemoveItem("IDCD_ID"); };
            a.Should().Throw <NotSupportedException>().WithMessage("Unsupported operation invoked on ReadOnlyRecord object.");
            roRec.Count.Should().Be(3);

            roRec = roClstr[1];
            roRec.Should().BeOfType <ReadOnlyRecord>();
            a = () => { roRec.AddItem("a", "b"); };
            a.Should().Throw <NotSupportedException>().WithMessage("Unsupported operation invoked on ReadOnlyRecord object.");
            roRec.Count.Should().Be(2);
        }
        public void RoClstrCtor_SimpleValuesIgnoreMisuse_CorrectData()
        {
            //arrange
            var items1 = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                       KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                       KeyValItem.CreateItem("I_num", 243, _typeDefs) };

            var items2 = new IItem[] { KeyValItem.CreateItem("I_#", 15, _typeDefs),
                                       KeyValItem.CreateItem("Fld1", "data1", _typeDefs) };

            var recs = new KeyValRecord[] { new KeyValRecord(items1, 16, 7, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem),
                                            new KeyValRecord(items2, 17, 8, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem) };

            //act
            var clstr = new KeyValCluster(recs, 9, 16, 78, null, null, _typeDefs, _config, null); //clstr# 9 starting at rec# 16; AllowTransformToAlterFields is true
                                                                                                  // note that startSourceNo 78 does not match the 1st record (7) - not a real scenario, but a good text
            var roClstr = new ReadOnlyCluster(clstr);                                             // this ctor causes objReadOnlyCluster to ignore misuse

            //assert
            roClstr.Count.Should().Be(2);
            roClstr.ClstrNo.Should().Be(9);
            roClstr.StartRecNo.Should().Be(16);
            roClstr.StartSourceNo.Should().Be(78);

            roClstr.Records.Count.Should().Be(2);

            var roRec = roClstr[0];

            roRec.Should().BeOfType <ReadOnlyRecord>();
            roRec.Count.Should().Be(3);
            roRec.RecNo.Should().Be(16);
            roRec.SourceNo.Should().Be(7);
            roRec.Items[0].Key.Should().Be("IDCD_ID");
            roRec.Keys[0].Should().Be("IDCD_ID");
            roRec[0].Should().Be("71941");
            roRec[1].Should().Be("blahblah");
            roRec["blah"].Should().Be("blahblah");
            roRec[2].Should().Be(243);
            roRec["I_num"].Should().Be(243);
            roClstr.GetRecord(0).Should().Be(roRec);

            roRec = roClstr[1];
            roRec.Should().BeOfType <ReadOnlyRecord>();
            roRec.Count.Should().Be(2);
            roRec.RecNo.Should().Be(17);
            roRec.SourceNo.Should().Be(8);
            roRec.Keys[0].Should().Be("I_#");
            roRec[0].Should().Be(15);
            roRec["I_#"].Should().Be(15);
            roRec.Keys[1].Should().Be("Fld1");
            roRec["Fld1"].Should().Be("data1");
            roClstr.GetRecord(1).Should().Be(roRec);
        }
Example #16
0
 /// <summary>
 /// Helper method to provide a complete ("fixed") list of items based on FieldsToUse, including missing/insignificant items
 /// (if outputRecord contains no corresponding field/item, use VoidKeyValItem)
 /// </summary>
 /// <param name="outputRecord"></param>
 /// <returns></returns>
 protected IEnumerable <IItem> ItemsFromFieldsToUse(KeyValRecord outputRecord)
 {
     foreach (var field in FieldsToUse)
     {
         if (outputRecord.Keys.Contains(field))
         {
             yield return(outputRecord.GetItem(field));
         }
         else
         {
             yield return(new VoidKeyValItem(field));
         }
     }
 }
Example #17
0
        public void GetEmptyClone_Bins_SameInstances()
        {
            //arrange
            IUntypedRecord rec = new KeyValRecord(_items, _recNo, 1, 0, null, new Dictionary <string, object>(), new Dictionary <string, object>(), _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var clone = rec.GetEmptyClone();

            //assert
            clone.TraceBin.Should().NotBeNull();
            clone.TraceBin.Should().BeSameAs(rec.TraceBin);
            clone.PropertyBin.Should().NotBeNull();
            clone.PropertyBin.Should().BeSameAs(rec.PropertyBin);
        }
        public void Clone_SimpleValues_SameData()
        {
            //arrange
            var items1 = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                       KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                       KeyValItem.CreateItem("I_num", 243, _typeDefs) };

            var items2 = new IItem[] { KeyValItem.CreateItem("I_#", 15, _typeDefs),
                                       KeyValItem.CreateItem("Fld1", "data1", _typeDefs) };

            var recs = new KeyValRecord[] { new KeyValRecord(items1, 16, 7, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem),
                                            new KeyValRecord(items2, 17, 8, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem) };

            //act
            var clstr = new KeyValCluster(recs, 9, 16, 78, null, null, _typeDefs, _config, null); //clstr# 9 starting at rec# 16; AllowTransformToAlterFields is true
                                                                                                  // note that startSourceNo 78 does not match the 1st record (7) - not a real scenario, but a good text
            var clone = clstr.GetClone();

            //assert
            clone.Should().NotBeSameAs(clstr);
            clone.Count.Should().Be(2);
            clone.ClstrNo.Should().Be(9);
            clone.StartRecNo.Should().Be(16);
            clone.StartSourceNo.Should().Be(78);

            var rec = clone[0];

            rec.Count.Should().Be(3);
            rec.RecNo.Should().Be(16);
            rec.SourceNo.Should().Be(7);
            rec.Keys[0].Should().Be("IDCD_ID");
            rec.Items[0].Key.Should().Be("IDCD_ID");
            rec.GetItem(0).Key.Should().Be("IDCD_ID");
            rec.GetItem("IDCD_ID").Key.Should().Be("IDCD_ID");
            rec[1].Should().Be("blahblah");
            rec["blah"].Should().Be("blahblah");
            rec[2].Should().Be(243);
            rec["I_num"].Should().Be(243);

            rec = clone[1];
            rec.Count.Should().Be(2);
            rec.RecNo.Should().Be(17);
            rec.SourceNo.Should().Be(8);
            rec.Keys[0].Should().Be("I_#");
            rec[0].Should().Be(15);
            rec.GetItem("I_#").Key.Should().Be("I_#");
            rec.Keys[1].Should().Be("Fld1");
            rec["Fld1"].Should().Be("data1");
        }
Example #19
0
        /// <summary>
        /// If no OutputFields specified, simply include all items in the record.
        /// If OutputFields are present, they drive items on output, possibly resulting in void items (if not present in the record); however, if ExcludeExtraneousFields then such void items are excluded.
        /// </summary>
        /// <param name="outputRecord"></param>
        /// <returns></returns>
        internal override IEnumerable <IItem> ItemsToOutput(KeyValRecord outputRecord)
        {
            if (_config.OutputFields == null)
            {
                return(outputRecord.Items);
            }
            //here, output is driven by OutputFields, i.e. FieldsToUse
            var allRequestedItems = base.ItemsFromFieldsToUse(outputRecord);

            if (_config.ExcludeExtraneousFields)
            {
                return(allRequestedItems.Where(itm => itm.ItemDef.Type != ItemType.Void));
            }
            return(allRequestedItems);
        }
        public void GetClone_SimpleValues_SameData()
        {
            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                      KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("I_num", 243, _typeDefs) };
            var rec = new KeyValRecord(items, 15, 4, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var clone = rec.GetClone();

            //assert
            clone.Should().NotBeSameAs(rec);
            clone.Count.Should().Be(3);
            clone.RecNo.Should().Be(15);
            clone.SourceNo.Should().Be(4);
            clone.Keys[0].Should().Be("IDCD_ID");
            clone.GetItem("IDCD_ID").Key.Should().Be("IDCD_ID");
            clone[1].Should().Be("blahblah");
            clone["blah"].Should().Be("blahblah");
            clone[2].Should().Be(243);
            clone["I_num"].Should().Be(243);

            var keys = clone.Keys.ToList();

            keys.Count.Should().Be(3);
            keys[0].Should().Be("IDCD_ID");
            keys[1].Should().Be("blah");
            keys[2].Should().Be("I_num");

            var itms = clone.Items.ToList();

            itms.Count.Should().Be(3);
            itms[0].Key.Should().Be("IDCD_ID");
            itms[0].Value.Should().BeOfType(typeof(string));
            itms[0].Value.Should().Be("71941");
            itms[0].ItemDef.Type.Should().Be(ItemType.String);
            itms[1].Key.Should().Be("blah");
            itms[1].Value.Should().BeOfType(typeof(string));
            itms[1].Value.Should().Be("blahblah");
            itms[1].ItemDef.Type.Should().Be(ItemType.String);
            itms[2].Key.Should().Be("I_num");
            itms[2].Value.Should().BeOfType(typeof(int));
            itms[2].Value.Should().Be(243);
            itms[2].ItemDef.Type.Should().Be(ItemType.Int);
        }
Example #21
0
        public void ConstructRecordWithDupKey_OutsideOfThreshold_NothingLogged()
        {
            //arrange
            var config = new OrchestratorConfig(new MockLogger(LogEntrySeverity.Error)); //Warning (sent as a result of dup) is outside of this threshold

            var items = new IItem[] { KeyValItem.CreateItem("Fld1", "71941", _typeDefs),
                                      KeyValItem.CreateItem("Fld2", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("Fld1", 243, _typeDefs) }; //this field has the same key as the first field
            int recNo = 25;

            //act
            var logger = (MockLogger)config.Logger;
            var rec    = new KeyValRecord(items, recNo, 1, 0, null, null, null, _typeDefs, config, null, ActionOnDuplicateKey.IgnoreItem);

            //assert
            logger.Results.Count.Should().Be(1); //Only Log Title
            logger.Results[0].Item1.Should().Be(LogEntrySeverity.None);
        }
        public void GetItemClone_NewStringValue_CorrectData()
        {
            //arrange
            IItem item  = KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs);
            var   items = new IItem[] { item };
            int   recNo = 14;
            var   rec   = new KeyValRecord(items, recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var clone = rec.GetItemClone(item, "newValue");

            //assert
            clone.Should().NotBeSameAs(item);
            clone.Should().BeOfType(typeof(KeyValItem <string>));
            clone.ItemDef.Type.Should().Be(ItemType.String);
            clone.Key.Should().Be("IDCD_ID");
            clone.Value.Should().Be("newValue");
        }
Example #23
0
        public void RemoveItem_NonExistingKey_ReturnFalse()
        {
            //arrange
            IUntypedRecord rec = new KeyValRecord(_items, _recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var result = rec.RemoveItem("badKey");

            //assert
            result.Should().BeFalse();

            rec.Count.Should().Be(4);
            rec.RecNo.Should().Be(26);

            rec[0].Should().BeOfType(typeof(string));
            rec[0].Should().Be("71941");
            rec[3].Should().BeOfType(typeof(string));
            rec[3].Should().Be("184");
        }
        public void GetItemClone_NoChange_SameData()
        {
            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                      KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("I_num", 243, _typeDefs) };

            //act
            var rec = new KeyValRecord(items, 16, 3, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            var clone = rec.GetItemClone(items[0], items[0].Value); //not a practical example to create exact clone of an item(!)

            //assert
            clone.Should().NotBeSameAs(items[0]); //note that this assertion may become invalid (KeyValItem is immutable)
            clone.Should().BeOfType(typeof(KeyValItem <string>));
            clone.ItemDef.Type.Should().Be(ItemType.String);
            clone.Key.Should().Be("IDCD_ID");
            clone.Value.Should().Be("71941");
        }
Example #25
0
        public void AddItem_CannotAlterFields_ReturnNull()
        {
            //arrange
            _config.AllowTransformToAlterFields = false; //it was set to true in test Initialize method
            IRecord rec = new KeyValRecord(_items, _recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var result = rec.AddItem("I_someNum", 360);

            //assert
            result.Should().BeNull();

            rec.Count.Should().Be(4);
            rec.RecNo.Should().Be(26);

            rec[0].Should().BeOfType(typeof(string));
            rec[0].Should().Be("71941");
            rec[3].Should().BeOfType(typeof(int));
            rec[3].Should().Be(184);
        }
Example #26
0
        public void AddItem_ExistingKey_ReturnVoidItem()
        {
            //arrange
            IUntypedRecord rec = new KeyValRecord(_items, _recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var result = rec.AddItem("blah", "someOtherBlah");

            //assert
            result.Should().BeOfType(typeof(VoidKeyValItem));
            result.Value.Should().BeNull();

            rec.Count.Should().Be(4);
            rec.RecNo.Should().Be(26);

            rec[0].Should().BeOfType(typeof(string));
            rec[0].Should().Be("71941");
            rec[3].Should().BeOfType(typeof(string));
            rec[3].Should().Be("184");
        }
        public void CreateX12Segment_4Elements_CorrectSegmentCreated()
        {
            //arrange
            var items = new IItem[] { KeyValItem.CreateItem("IDCD_ID", "71941", _typeDefs),
                                      KeyValItem.CreateItem("blah", "blahblah", _typeDefs),
                                      KeyValItem.CreateItem("I_num", 243, _typeDefs) };
            var rec = new KeyValRecord(items, 12, 3, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var x12Seg = rec.CreateEmptyX12Segment("NM1", 4);

            x12Seg[2] = null;
            x12Seg[4] = "blah";

            //assert
            x12Seg.Should().NotBeSameAs(rec);
            x12Seg.Count.Should().Be(5); // 1 + 4
            x12Seg.RecNo.Should().Be(12);
            x12Seg.SourceNo.Should().Be(3);
            x12Seg.Keys.Count.Should().Be(5);
            x12Seg.Items.Count.Should().Be(5);

            x12Seg[0].Should().Be("NM1");
            x12Seg["Segment"].Should().Be("NM1");
            x12Seg.Keys[0].Should().Be("Segment");
            x12Seg[1].Should().Be(string.Empty);
            x12Seg["Elem001"].Should().Be(string.Empty);
            x12Seg.Keys[1].Should().Be("Elem001");
            x12Seg[2].Should().BeNull();
            x12Seg["Elem002"].Should().BeNull();
            x12Seg.Keys[2].Should().Be("Elem002");
            x12Seg[3].Should().Be(string.Empty);
            x12Seg["Elem003"].Should().Be(string.Empty);
            x12Seg.Keys[3].Should().Be("Elem003");
            x12Seg[4].Should().Be("blah");
            x12Seg["Elem004"].Should().Be("blah");
            x12Seg.Keys[4].Should().Be("Elem004");
            x12Seg[5].Should().BeNull();
            x12Seg["Elem005"].Should().BeNull();
            //x12Seg.Keys[5].Should().BeNull(); - this throws ArgumentOutOfRangeException
        }
Example #28
0
        public void RemoveItem_ExistingKey_RemoveItemAndReturnTrue()
        {
            //arrange
            IUntypedRecord rec = new KeyValRecord(_items, _recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);

            //act
            var result = rec.RemoveItem("D_date");

            //assert
            result.Should().BeTrue();

            rec.Count.Should().Be(3);
            rec.RecNo.Should().Be(26);

            rec[0].Should().BeOfType(typeof(string));
            rec[0].Should().Be("71941");
            rec[1].Should().BeOfType(typeof(string));
            rec[1].Should().Be("blahblah");
            rec[2].Should().BeOfType(typeof(string));
            rec[2].Should().Be("184");
        }
Example #29
0
        public void AddOrReplaceItem_ExistingKey_ReplaceAndReturnsTrue()
        {
            //arrange
            IUntypedRecord rec           = new KeyValRecord(_items, _recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);
            var            itemToReplace = KeyValItem.CreateItem("I_num", 518, _typeDefs);

            //act
            var result = rec.AddOrReplaceItem(itemToReplace);

            //assert
            result.Should().BeTrue();

            rec.Count.Should().Be(4);
            rec.RecNo.Should().Be(26);

            rec[0].Should().BeOfType(typeof(string));
            rec[0].Should().Be("71941");
            rec[3].Should().BeOfType(typeof(string));
            rec[3].Should().Be("518");
            rec.Keys[3].Should().Be("I_num");
        }
Example #30
0
        public void AddOrReplaceItem_NewKeyButCannotAlterFields_ReturnNull()
        {
            //arrange
            _config.AllowTransformToAlterFields = false; //it was set to true in test Initialize method
            IRecord rec       = new KeyValRecord(_items, _recNo, 1, 0, null, null, null, _typeDefs, _config, null, ActionOnDuplicateKey.IgnoreItem);
            var     itemToAdd = KeyValItem.CreateItem("I_newNum", 518, _typeDefs);

            //act
            var result = rec.AddOrReplaceItem(itemToAdd);

            //assert
            result.Should().NotHaveValue();

            rec.Count.Should().Be(4);
            rec.RecNo.Should().Be(26);

            rec[0].Should().BeOfType(typeof(string));
            rec[0].Should().Be("71941");
            rec[3].Should().BeOfType(typeof(int));
            rec[3].Should().Be(184);
        }