// Reasonably simple way of computing the maximum/minimum offset
        // from either periods or transitions, with or without a tail zone.
        private static Offset ComputeOffset <T>(IEnumerable <T> elements,
                                                OffsetExtractor <T> extractor,
                                                DateTimeZone tailZone,
                                                OffsetAggregator aggregator)
        {
            Preconditions.CheckNotNull(elements, "elements");
            Offset ret;

            using (var iterator = elements.GetEnumerator())
            {
                var hasFirst = iterator.MoveNext();
                Preconditions.CheckArgument(hasFirst, "iterator", "No transitions / periods specified");
                ret = extractor(iterator.Current);
                while (iterator.MoveNext())
                {
                    ret = aggregator(ret, extractor(iterator.Current));
                }
            }
            if (tailZone != null)
            {
                // Effectively a shortcut for picking either tailZone.MinOffset or
                // tailZone.MaxOffset
                Offset bestFromZone = aggregator(tailZone.MinOffset, tailZone.MaxOffset);
                ret = aggregator(ret, bestFromZone);
            }
            return(ret);
        }
Exemplo n.º 2
0
        public void TestOffsetParse()
        {
            string text      = "P99912:29:12 10/26/17 P5V1_211";
            var    extractor = OffsetExtractor.Build <Message>(new List <OffsetRule> {
                new OffsetRule {
                    Field = "Code", Offset = 1, Length = 3
                },
                new OffsetRule {
                    Field = "TimeStamp", Offset = 4, Length = 17
                },
                new OffsetRule {
                    Field = "SenderName", Offset = 22, Length = 8
                },
            });
            var message = extractor.Parse(text);

            Assert.AreEqual("999", message.Code);
            Assert.AreEqual("12:29:12 10/26/17", message.TimeStamp);
            Assert.AreEqual("P5V1_211", message.SenderName);
        }