public void Consume_NumberTest(object expected, string input, ENumericTokenType tokenType) { var Stream = new DataConsumer <char>(input.AsMemory()); CssTokenizer.Consume_Number(Stream, out ReadOnlyMemory <char> outResult, out object outNumber, out ENumericTokenType outTokenType); Assert.Equal(tokenType, outTokenType); Assert.Equal(expected, outNumber); }
public void EncodeTest(ENumericTokenType Type, string Value, double Number) { string Actual = new NumberToken(Type, Value, Number).Encode(); Assert.Equal(Value, Actual); }
public static void Consume_Number(DataConsumer <char> Stream, out ReadOnlyMemory <char> /* */ outResult, out object outNumber, out ENumericTokenType outType) {/* Docs: https://www.w3.org/TR/css-syntax-3/#consume-number */ if (Stream is null) { throw new ArgumentNullException(nameof(Stream)); } Contract.EndContractBlock(); outType = ENumericTokenType.Integer; bool IsPositive = true; bool Exponent_IsPositive = true; bool Decimal = false; bool HasExponent = false; int Start = Stream.Position; if (Stream.Next == CHAR_HYPHEN_MINUS) { IsPositive = false; Stream.Consume(); } else if (Stream.Next == CHAR_PLUS_SIGN) { Stream.Consume(); } if (!Stream.Consume_While(Is_Ascii_Digit, out ReadOnlySpan <char> Integer)) { throw new CssParserException(ParserErrors.PARSING_FAILED); } if (Stream.Next == CHAR_FULL_STOP) { outType = ENumericTokenType.Number; Decimal = true; Stream.Consume(); } if (!Stream.Consume_While(Is_Ascii_Digit, out ReadOnlySpan <char> Fraction) && Decimal) { throw new CssParserException(ParserErrors.PARSING_FAILED); } if (Stream.Next == CHAR_E_UPPER || Stream.Next == CHAR_E_LOWER) { HasExponent = true; outType = ENumericTokenType.Number; Stream.Consume(); } if (Stream.Next == CHAR_HYPHEN_MINUS) { Exponent_IsPositive = false; Stream.Consume(); } else if (Stream.Next == CHAR_PLUS_SIGN) { Stream.Consume(); } if (!Stream.Consume_While(Is_Ascii_Digit, out ReadOnlySpan <char> Exponent) && HasExponent) { throw new CssParserException(ParserErrors.PARSING_FAILED); } int len = Stream.Position - Start; outResult = Stream.AsMemory().Slice(Start, len); //return S * (I + (F * Math.Pow(10, -D))) * Math.Pow(10, T*E); if (Decimal) { outNumber = ParsingCommon.ToDecimal(IsPositive ? 1 : -1, Integer, Fraction, Exponent_IsPositive ? 1 : -1, Exponent); } else { outNumber = ParsingCommon.ToInteger(IsPositive ? 1 : -1, Integer, Exponent_IsPositive ? 1 : -1, Exponent); } }
public void EqualsTest(ENumericTokenType Type, string Value, double Number) { Assert.Equal(new NumberToken(Type, Value, Number), new NumberToken(Type, Value, Number)); }
public void EncodeTest(ENumericTokenType Type, string Value, double Number, string Unit, string Expected) { string Actual = new DimensionToken(Type, Value, Number, Unit).Encode(); Assert.Equal(Expected, Actual); }
public void EqualsTest(ENumericTokenType Type, string Value, double Number, string Unit) { Assert.Equal(new DimensionToken(Type, Value, Number, Unit), new DimensionToken(Type, Value, Number, Unit)); }
public DimensionToken(ENumericTokenType DataType, ReadOnlySpan <char> Value, object Number, ReadOnlySpan <char> Unit) : base(ECssTokenType.Dimension, Value) { this.Number = Number; this.DataType = DataType; this.Unit = Unit.ToString(); }
public NumberToken(ENumericTokenType DataType, ReadOnlySpan <char> Value, object Number) : base(ECssTokenType.Number, Value) { this.DataType = DataType; this.Number = Number; }