public void GetTimePeriodsFromTextTest_DateTime()
        {
            var options = new TemporalParserOptions
            {
                BaseDate = new DateTime(2017, 1, 1)
            };

            AssertValidParsedText(new List <ITimePeriod>
            {
                new Minute(2017, 1, 3, 7, 30)
            }, "At 7:30 on Tuesday", options);
            AssertValidParsedText(new List <ITimePeriod>
            {
                new Minute(2017, 1, 7, 1, 0)
            }, "At 1 o'clock on Saturday", options);
            AssertValidParsedText(new List <ITimePeriod>
            {
                new Minute(2017, 1, 4, 17, 0)
            }, "On Wednesday at 5pm", options);
            AssertValidParsedText(new List <ITimePeriod>
            {
                new Minute(2017, 1, 6, 4, 0)
            }, "Friday at 4am", options);
            AssertValidParsedText(new List <ITimePeriod>
            {
                new TimeRange(new DateTime(2017, 1, 2), new DateTime(2017, 1, 2, 15, 30, 0))
            }, "Before 3:30pm on Monday", options);
            AssertValidParsedText(new List <ITimePeriod>
            {
                new TimeRange(new DateTime(2017, 1, 6, 2, 30, 0), new Day(2017, 1, 6).End)
            }, "After 2:30 on Friday", options);
        }
        public void GetTimePeriodsFromTextTest_SequenceDateTime()
        {
            var options = new TemporalParserOptions
            {
                BaseDate = new DateTime(2017, 1, 1)
            };

            AssertValidParsedText(new List <ITimePeriod>
            {
                new SequencedTimeRange(new TimeSpan(7, 0, 0, 0), new DateTime(2017, 1, 3), new DateTime(2017, 1, 10))
            }, "Every Tuesday until the 10th", options);

            AssertValidParsedText(new List <ITimePeriod>
            {
                new SequencedTimeRange(new TimeSpan(7, 0, 0, 0), new DateTime(2017, 1, 6, 9, 35, 0))
            }, "Every Friday at 9:35am", options);

            AssertValidParsedText(new List <ITimePeriod>
            {
                new SequencedTimeRange(new TimeSpan(7, 0, 0, 0), new DateTime(2017, 1, 31, 16, 0, 0))
            }, "Every Tuesday after the 26th at 4pm", options);
        }
        private void AssertValidParsedText(IEnumerable <ITimePeriod> expected, string input, TemporalParserOptions options)
        {
            var parser             = new TemporalParser();
            var parsedComponents   = parser.GetTimePeriodsFromText(input, options).ToList();
            var expectedComponents = expected.ToList();

            Assert.AreEqual(expectedComponents.Count, parsedComponents.Count);

            for (int i = 0, l = parsedComponents.Count; i < l; i++)
            {
                var parsedComponent   = parsedComponents[i];
                var expectedComponent = expectedComponents[i];

                Assert.AreEqual(expectedComponent.Start, parsedComponent.Start);
                Assert.AreEqual(expectedComponent.End, parsedComponent.End);

                if (expectedComponent is SequencedTimeRange)
                {
                    Assert.IsInstanceOfType(parsedComponent, typeof(SequencedTimeRange));
                    var expectedSequence = (expectedComponent as SequencedTimeRange).SequenceInterval;
                    var parsedSequence   = (parsedComponent as SequencedTimeRange).SequenceInterval;
                    Assert.AreEqual(expectedSequence.Start, parsedSequence.Start);
                    Assert.AreEqual(expectedSequence.End, parsedSequence.End);
                }
            }
        }