Browse Source
Fixed Lexer bug (C#): OverflowException was thrown when integer literal was at end of expression. Added unit tests for literals. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@77 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
12 changed files with 536 additions and 455 deletions
@ -0,0 +1,78 @@
@@ -0,0 +1,78 @@
|
||||
using System; |
||||
using System.IO; |
||||
using NUnit.Framework; |
||||
using ICSharpCode.NRefactory.Parser; |
||||
using ICSharpCode.NRefactory.Parser.CSharp; |
||||
using ICSharpCode.NRefactory.PrettyPrinter; |
||||
|
||||
namespace ICSharpCode.NRefactory.Tests.Lexer.CSharp |
||||
{ |
||||
[TestFixture] |
||||
public sealed class NumberLexerTests |
||||
{ |
||||
ILexer GenerateLexer(StringReader sr) |
||||
{ |
||||
return ParserFactory.CreateLexer(SupportedLanguages.CSharp, sr); |
||||
} |
||||
|
||||
Token GetSingleToken(string text) |
||||
{ |
||||
ILexer lexer = GenerateLexer(new StringReader(text)); |
||||
Token t = lexer.NextToken(); |
||||
Assert.AreEqual(Tokens.EOF, lexer.NextToken().kind, "Tokens.EOF"); |
||||
return t; |
||||
} |
||||
|
||||
void CheckToken(string text, object val) |
||||
{ |
||||
Token t = GetSingleToken(text); |
||||
Assert.AreEqual(Tokens.Literal, t.kind, "Tokens.Literal"); |
||||
Assert.IsNotNull(t.literalValue, "literalValue is null"); |
||||
Assert.AreEqual(val, t.literalValue, "literalValue"); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestSingleDigit() |
||||
{ |
||||
CheckToken("5", 5); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestZero() |
||||
{ |
||||
CheckToken("0", 0); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestInteger() |
||||
{ |
||||
CheckToken("66", 66); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestOctalInteger() |
||||
{ |
||||
CheckToken("077", 077); |
||||
CheckToken("056", 056); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestHexadecimalInteger() |
||||
{ |
||||
CheckToken("0x99F", 0x99F); |
||||
CheckToken("0xAB1f", 0xAB1f); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestDouble() |
||||
{ |
||||
CheckToken("1.0", 1.0); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestFloat() |
||||
{ |
||||
CheckToken("1.0f", 1.0f); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,86 @@
@@ -0,0 +1,86 @@
|
||||
using System; |
||||
using System.IO; |
||||
using NUnit.Framework; |
||||
using ICSharpCode.NRefactory.Parser; |
||||
using ICSharpCode.NRefactory.Parser.VB; |
||||
using ICSharpCode.NRefactory.PrettyPrinter; |
||||
|
||||
namespace ICSharpCode.NRefactory.Tests.Lexer.VB |
||||
{ |
||||
[TestFixture] |
||||
public sealed class LiteralsTests |
||||
{ |
||||
ILexer GenerateLexer(StringReader sr) |
||||
{ |
||||
return ParserFactory.CreateLexer(SupportedLanguages.VBNet, sr); |
||||
} |
||||
|
||||
Token GetSingleToken(string text) |
||||
{ |
||||
ILexer lexer = GenerateLexer(new StringReader(text)); |
||||
Token t = lexer.NextToken(); |
||||
Assert.AreEqual(Tokens.EOL, lexer.NextToken().kind, "Tokens.EOL"); |
||||
Assert.AreEqual(Tokens.EOF, lexer.NextToken().kind, "Tokens.EOF"); |
||||
return t; |
||||
} |
||||
|
||||
void CheckToken(string text, int tokenType, object val) |
||||
{ |
||||
Token t = GetSingleToken(text); |
||||
Assert.AreEqual(tokenType, t.kind, "Tokens.Literal"); |
||||
Assert.IsNotNull(t.literalValue, "literalValue is null"); |
||||
Assert.AreEqual(val, t.literalValue, "literalValue"); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestSingleDigit() |
||||
{ |
||||
CheckToken("5", Tokens.LiteralInteger, 5); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestZero() |
||||
{ |
||||
CheckToken("0", Tokens.LiteralInteger, 0); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestInteger() |
||||
{ |
||||
CheckToken("15", Tokens.LiteralInteger, 15); |
||||
CheckToken("8581", Tokens.LiteralInteger, 8581); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestHexadecimalInteger() |
||||
{ |
||||
CheckToken("&H10", Tokens.LiteralInteger, 0x10); |
||||
CheckToken("&H10&", Tokens.LiteralInteger, 0x10); |
||||
CheckToken("&h3ff&", Tokens.LiteralInteger, 0x3ff); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestStringLiterals() |
||||
{ |
||||
CheckToken("\"\"", Tokens.LiteralString, ""); |
||||
CheckToken("\"Hello, World!\"", Tokens.LiteralString, "Hello, World!"); |
||||
CheckToken("\"\"\"\"", Tokens.LiteralString, "\""); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestCharacterLiterals() |
||||
{ |
||||
CheckToken("\" \"c", Tokens.LiteralCharacter, ' '); |
||||
CheckToken("\"!\"c", Tokens.LiteralCharacter, '!'); |
||||
CheckToken("\"\"\"\"c", Tokens.LiteralCharacter, '"'); |
||||
} |
||||
|
||||
/* |
||||
* TODO : Test the following: |
||||
public const int LiteralDouble = 6; |
||||
public const int LiteralSingle = 7; |
||||
public const int LiteralDecimal = 8; |
||||
public const int LiteralDate = 9; |
||||
*/ |
||||
} |
||||
} |
@ -1,14 +1,4 @@
@@ -1,14 +1,4 @@
|
||||
<Project DefaultTargets="Build" xmlns:Conversion="urn:Conversion" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
||||
<StartProgram> |
||||
</StartProgram> |
||||
<StartArguments> |
||||
</StartArguments> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
||||
<StartProgram> |
||||
</StartProgram> |
||||
<StartArguments> |
||||
</StartArguments> |
||||
</PropertyGroup> |
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " /> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " /> |
||||
</Project> |
Loading…
Reference in new issue