public void TestGetQuotedString_EscapeAtEnd() { var cursor = new PatternCursor("'abc\\"); Assert.AreEqual('\'', GetNextCharacter(cursor)); Assert.Throws <InvalidPatternException>(() => cursor.GetQuotedString('\'')); }
public void TestGetEmbeddedPattern_QuotedCloseCharacter() { var cursor = new PatternCursor("x<oops'>'"); cursor.MoveNext(); Assert.Throws <InvalidPatternException>(() => cursor.GetEmbeddedPattern('<', '>')); }
public void TestGetEmbeddedPattern_WrongOpenCharacter() { var cursor = new PatternCursor("x(oops)"); cursor.MoveNext(); Assert.Throws <InvalidPatternException>(() => cursor.GetEmbeddedPattern('<', '>')); }
public void GetEmbeddedPattern_Invalid(string text) { var cursor = new PatternCursor(text); cursor.MoveNext(); Assert.Throws <InvalidPatternException>(() => cursor.GetEmbeddedPattern()); }
public void TestGetRepeatCount_ExceedsMax() { var cursor = new PatternCursor("aaa"); Assert.IsTrue(cursor.MoveNext()); Assert.Throws <InvalidPatternException>(() => cursor.GetRepeatCount(2)); }
public void TestGetQuotedString_MissingCloseQuote() { var cursor = new PatternCursor("'abc"); char openQuote = GetNextCharacter(cursor); Assert.Throws <InvalidPatternException>(() => cursor.GetQuotedString(openQuote)); }
public void GetQuotedString_Invalid(string pattern) { var cursor = new PatternCursor(pattern); Assert.AreEqual('\'', GetNextCharacter(cursor)); Assert.Throws <InvalidPatternException>(() => cursor.GetQuotedString('\'')); }
private static void HandleZone(PatternCursor pattern, SteppedPatternBuilder <ZonedDateTime, ZonedDateTimeParseBucket> builder) { builder.AddField(PatternFields.Zone, pattern.Current); builder.AddParseAction(ParseZone); builder.AddFormatAction((value, sb) => sb.Append(value.Zone.Id)); }
private static void HandleZoneAbbreviation(PatternCursor pattern, SteppedPatternBuilder <ZonedDateTime, ZonedDateTimeParseBucket> builder) { builder.AddField(PatternFields.ZoneAbbreviation, pattern.Current); builder.SetFormatOnly(); builder.AddFormatAction((value, sb) => sb.Append(value.GetZoneInterval().Name)); }
private static void HandleOffset(PatternCursor pattern, SteppedPatternBuilder <OffsetDateTime, OffsetDateTimeParseBucket> builder) { builder.AddField(PatternFields.EmbeddedOffset, pattern.Current); string embeddedPattern = pattern.GetEmbeddedPattern(); var offsetPattern = OffsetPattern.Create(embeddedPattern, builder.FormatInfo).UnderlyingPattern; builder.AddEmbeddedPattern(offsetPattern, (bucket, offset) => bucket.Offset = offset, zdt => zdt.Offset); }
public void TestGetQuotedString_Empty() { var cursor = new PatternCursor("''"); char openQuote = GetNextCharacter(cursor); string actual = cursor.GetQuotedString(openQuote); Assert.AreEqual(string.Empty, actual); Assert.IsFalse(cursor.MoveNext()); }
public void TestGetQuotedString_HandlesEscapedCloseQuote() { var cursor = new PatternCursor("'ab\\'c'"); char openQuote = GetNextCharacter(cursor); string actual = cursor.GetQuotedString(openQuote); Assert.AreEqual("ab'c", actual); Assert.IsFalse(cursor.MoveNext()); }
public void TestGetQuotedString_HandlesDoubleQuote() { var cursor = new PatternCursor("\"abc\""); char openQuote = GetNextCharacter(cursor); string actual = cursor.GetQuotedString(openQuote); Assert.AreEqual("abc", actual); Assert.IsFalse(cursor.MoveNext()); }
public void TestGetEmbeddedPattern_Valid_WithEscaping() { var cursor = new PatternCursor(@"x<HH:\Tmm>y"); cursor.MoveNext(); string embedded = cursor.GetEmbeddedPattern('<', '>'); Assert.AreEqual(@"HH:\Tmm", embedded); Assert.AreEqual('>', cursor.Current); }
public void GetQuotedString_Valid(string pattern, string expected) { var cursor = new PatternCursor(pattern); Assert.AreEqual('\'', GetNextCharacter(cursor)); string actual = cursor.GetQuotedString('\''); Assert.AreEqual(expected, actual); Assert.IsFalse(cursor.MoveNext()); }
public void TestGetQuotedString_HandlesOtherQuote() { var cursor = new PatternCursor("[abc]"); GetNextCharacter(cursor); string actual = cursor.GetQuotedString(']'); Assert.AreEqual("abc", actual); Assert.IsFalse(cursor.MoveNext()); }
public void GetRepeatCount_Valid(string text, int expectedCount) { var cursor = new PatternCursor(text); Assert.IsTrue(cursor.MoveNext()); int actual = cursor.GetRepeatCount(10); Assert.AreEqual(expectedCount, actual); ValidateCurrentCharacter(cursor, expectedCount - 1, 'a'); }
public void TestGetQuotedString() { var cursor = new PatternCursor("'abc'"); Assert.AreEqual('\'', GetNextCharacter(cursor)); string actual = cursor.GetQuotedString('\''); Assert.AreEqual("abc", actual); Assert.IsFalse(cursor.MoveNext()); }
public void TestGetRepeatCount_Three() { var cursor = new PatternCursor("aaa"); Assert.IsTrue(cursor.MoveNext()); int actual = cursor.GetRepeatCount(10); Assert.AreEqual(3, actual); ValidateCurrentCharacter(cursor, 2, 'a'); }
public void TestGetEmbeddedPattern_Valid() { var cursor = new PatternCursor("x<HH:mm>y"); cursor.MoveNext(); string embedded = cursor.GetEmbeddedPattern('<', '>'); Assert.AreEqual("HH:mm", embedded); ValidateCurrentCharacter(cursor, 7, '>'); }
public void GetEmbeddedPattern_Valid(string pattern, string expectedEmbedded) { var cursor = new PatternCursor(pattern); cursor.MoveNext(); string embedded = cursor.GetEmbeddedPattern(); Assert.AreEqual(expectedEmbedded, embedded); ValidateCurrentCharacter(cursor, expectedEmbedded.Length + 2, '>'); }
public void TestGetQuotedString_NotAtEnd() { var cursor = new PatternCursor("'abc'more"); char openQuote = GetNextCharacter(cursor); string actual = cursor.GetQuotedString(openQuote); Assert.AreEqual("abc", actual); ValidateCurrentCharacter(cursor, 4, '\''); Assert.AreEqual('m', GetNextCharacter(cursor)); }
private static void AssertValidNodaPattern(CultureInfo culture, string pattern) { PatternCursor cursor = new PatternCursor(pattern); while (cursor.MoveNext()) { if (cursor.Current == '\'') { cursor.GetQuotedString('\''); } else { Assert.IsTrue(ExpectedCharacters.Contains(cursor.Current), "Pattern '" + pattern + "' contains unquoted, unexpected characters"); } } // Check that the pattern parses LocalTimePattern.Create(pattern, culture); }
private static void HandleOffset(PatternCursor pattern, SteppedPatternBuilder <OffsetDateTime, OffsetDateTimeParseBucket> builder) { builder.AddField(PatternFields.EmbeddedOffset, pattern.Current); string embeddedPattern = pattern.GetEmbeddedPattern('<', '>'); var offsetPattern = OffsetPattern.Create(embeddedPattern, builder.FormatInfo).UnderlyingPattern; builder.AddParseAction((value, bucket) => { var result = offsetPattern.ParsePartial(value); if (!result.Success) { return(result.ConvertError <OffsetDateTime>()); } bucket.Offset = result.Value; return(null); }); builder.AddFormatAction((value, sb) => offsetPattern.AppendFormat(value.Offset, sb)); }
private static void HandleDayOfMonth(PatternCursor pattern, SteppedPatternBuilder <AnnualDate, AnnualDateParseBucket> builder) { int count = pattern.GetRepeatCount(2); PatternFields field; switch (count) { case 1: case 2: field = PatternFields.DayOfMonth; // Handle real maximum value in the bucket builder.AddParseValueAction(count, 2, pattern.Current, 1, 99, (bucket, value) => bucket.DayOfMonth = value); builder.AddFormatLeftPad(count, value => value.Day, assumeNonNegative: true, assumeFitsInCount: count == 2); break; default: throw new InvalidOperationException("Invalid count!"); } builder.AddField(field, pattern.Current); }
private static void AssertValidNodaPattern(CultureInfo culture, string pattern) { PatternCursor cursor = new PatternCursor(pattern); while (cursor.MoveNext()) { if (cursor.Current == '\'') { cursor.GetQuotedString('\''); } else { // We'll never do anything "special" with non-ascii characters anyway, // so we don't mind if they're not quoted. if (cursor.Current < '\u0080') { Assert.IsTrue(ExpectedCharacters.Contains(cursor.Current), "Pattern '" + pattern + "' contains unquoted, unexpected characters"); } } } // Check that the pattern parses LocalTimePattern.Create(pattern, culture); }
private static void HandlePlus(PatternCursor pattern, SteppedPatternBuilder <Duration, DurationParseBucket> builder) { builder.AddField(PatternFields.Sign, pattern.Current); builder.AddRequiredSign((bucket, positive) => bucket.IsNegative = !positive, duration => duration.Ticks >= 0); }
private static void HandleMinus(PatternCursor pattern, SteppedPatternBuilder <Duration, DurationParseBucket> builder) { builder.AddField(PatternFields.Sign, pattern.Current); builder.AddNegativeOnlySign((bucket, positive) => bucket.IsNegative = !positive, duration => duration.FloorDays >= 0); }
private static void HandleMinus(PatternCursor pattern, SteppedPatternBuilder <Offset, OffsetParseBucket> builder) { builder.AddField(PatternFields.Sign, pattern.Current); builder.AddNegativeOnlySign((bucket, positive) => bucket.IsNegative = !positive, offset => offset.Milliseconds >= 0); }