Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7645re/added conditional elif block #519

Merged
merged 7 commits into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Cesium.Parser.Tests/Cesium.Parser.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
<ParentFile>StatementParserTests</ParentFile>
<DependentUpon>StatementParserTests.cs</DependentUpon>
</None>
<None Update="PreprocessorTests\verified\PreprocessorTests.*.txt">
<ParentFile>PreprocessorTests</ParentFile>
<DependentUpon>PreprocessorTests.cs</DependentUpon>
</None>
</ItemGroup>

</Project>
273 changes: 273 additions & 0 deletions Cesium.Parser.Tests/PreprocessorTests/PreprocessorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,18 @@ public Task IgnoredInclude() => DoTest("""
#endif
""");

[Fact]
public Task IncludeInElif() => DoTest("""
#define NUM 1
#if NUM == 2
#include NUM
#elif NUM == 1
#include <foo.h>
#else
#include NUM
#endif
""", new() { ["foo.h"] = "int x = 0;" });

[Fact]
public Task PragmaOnce() => DoTest(@"
int test()
Expand All @@ -110,6 +122,20 @@ int test()
Assert.Equal(@"Error: ""Error message"" test", err.Message);
}

[Fact, NoVerify]
public async Task ErrorMsgInsideElif()
{
PreprocessorException err = await Assert.ThrowsAsync<PreprocessorException>(async () => await DoTest(
@"#define NUM 1
#if NUM == 2
#elif NUM == 1
#error ""Error message""
#endif
{}"
));
Assert.Equal(@"Error: ""Error message""", err.Message);
}

[Fact]
public Task IfDefinedLiteral() => DoTest(
@"#define foo main
Expand Down Expand Up @@ -145,6 +171,131 @@ public Task IfNotDefinedLiteral() => DoTest(
#ifndef foo
int foo() { return 0; }
#endif
");

[Fact]
public Task IfValidElifInvalid() => DoTest(
@"#define num 1
#if num == 1
int ifFunc() { return 0; }
#elif num == 2
int elifFunc() { return 0; }
#endif
");

[Fact]
public Task IfInvalidElifValid() => DoTest(
@"#define num 1
#if num == 2
int ifFunc() { return 0; }
#elif num == 1
int elifFunc() { return 0; }
#endif
");

[Fact]
public Task IfInvalidTwoElifFirstElifValidSecondInvalid() => DoTest(
@"#define num 1
#if num == 2
int ifFunc() { return 0; }
#elif num == 1
int elifOneFunc() { return 0; }
#elif num == 2
int elifTwoFunc() { return 0; }
#endif
");

[Fact]
public Task IfInvalidTwoElifFirstElifInvalidSecondValid() => DoTest(
@"#define num 1
#if num == 2
int ifFunc() { return 0; }
#elif num == 2
int elifOneFunc() { return 0; }
#elif num == 1
int elifTwoFunc() { return 0; }
#endif
");

[Fact]
public Task IfInvalidAllElifInvalidElseValid() => DoTest(
@"#define num 1
#if num == 2
int ifFunc() { return 0; }
#elif num == 2
int elifOneFunc() { return 0; }
#elif num == 2
int elifTwoFunc() { return 0; }
#else
int elseFunc() { return 0; }
#endif
");

[Fact]
public Task IfInvalidElifInvalidElseValid() => DoTest(
@"#define num 1
#if num == 2
int ifFunc() { return 0; }
#elif num == 3
int elifFunc() { return 0; }
#else
int elseFunc() { return 0; }
#endif
");

[Fact]
public Task IfInvalidElifValidNestedElifValidElseInvalid() => DoTest(
@"#define NUM 9
#if NUM == 2
int ifFunc() { return 0; }
#elif NUM > 4
#if NUM == 4
int nestedIfFunc() { return 0; }
#elif NUM == 9
int nestedElifFunc() { return 0; }
#else
int nestedElseFunc() { return 0; }
#endif
#else
int elseFunc() { return 0; }
#endif
");

[Fact]
public Task IfInvalidElifValidNestedElifInvalidElseInvalid() => DoTest(
@"#define NUM 9
#if NUM == 2
int ifFunc() { return 0; }
#elif NUM > 3
inf elifFunc() { return 0; }
#if NUM == 3
int nestedIfFunc() { return 0; }
#elif NUM == 1
int nestedElifFunc() { return 0; }
#endif
#else
int elseFunc() { return 0; }
#endif
");

[Fact]
public Task IfdefValidElifInvalid() => DoTest(
@"#define NUM 10
#ifdef NUM
int ifdefFunc() { return 1; }
#elif NUM == 10
int elifFunc() { return 1; }
#endif
");

[Fact]
public Task IfdefInvalidElifValid() => DoTest(
@"#define NUM 10
#ifdef NOTDEFINED
int ifdefFunc() { return 1; }
#elif NUM == 10
int elifFunc() { return 1; }
#endif
");

[Fact]
Expand All @@ -157,6 +308,104 @@ public Task NestedIfNotDefinedLiteral() => DoTest(
#endif
int foo_included2() { return 0; }
#endif
");

[Fact]
public Task NestedElifInInvalidIf() => DoTest(
@"#define TEST 3
#if TEST == 2
int ifFunc() { return 0; }
#if TEST == 2
int ifNestedFunc() { return 0; }
#elif TEST == 3
int main() { return 0; }
#endif
#endif
");

[Fact]
public Task NestedElifInInvalidIfdef() => DoTest(
@"#define TEST 3
#ifdef NOTEST
int ifFunc() { return 0; }
#if TEST == 2
int ifNestedFunc() { return 0; }
#elif TEST == 3
int main() { return 0; }
#endif
#endif
");
[Fact]
public Task NestedElifInValidIf() => DoTest(
@"#define TEST 3
#if TEST == 3
#if TEST == 2
int ifFunc() { return 0; }
#elif TEST == 3
int main() { return 0; }
#endif
#endif
");

[Fact]
public Task NestedElifInValidIfdef() => DoTest(
@"#define TEST 3
#ifdef TEST
#if TEST == 2
int ifFunc() { return 0; }
#elif TEST == 3
int main() { return 0; }
#endif
#endif
");

[Fact]
public Task NestedElifInInvalidIfndef() => DoTest(
@"#define TEST 3
#ifndef TEST
#ifndef TEST
int ifFunc() { return 0; }
#elif TEST == 3
int main() { return 0; }
#endif
#endif
");

[Fact, NoVerify]
public async Task ElifWithoutStartConditionBlockKeyWord()
{
var exception = await Assert.ThrowsAsync<PreprocessorException>(async () => await DoPreprocess(
@"#elif TEST == 1
int foo() { return 0; }
#endif
"));
Assert.Equal("Elif can't exist without an if,ifdef,ifndef block", exception.Message);
}

[Fact]
public Task NestedElifInValidIfndef() => DoTest(
@"#define TEST 3
#ifndef NOTEST
#ifndef TEST
int ifFunc() { return 0; }
#elif TEST == 3
int main() { return 0; }
#endif
#endif
");

[Fact]
public Task NestedElifInElif() => DoTest(
@"#define TEST 3
#if TEST == 2
int ifFunc() { return 0; }
#elif TEST == 3
#if TEST == 2
int ifNestedFunc() { return 0; }
#elif TEST == 3
int main() { return 0; }
#endif
#endif
");

[Fact]
Expand Down Expand Up @@ -374,6 +623,19 @@ public Task UndefMacro() => DoTest(
#if !(defined mycondition)
int foo() { return 0; }
#endif
");

[Fact]
public Task UndefMacroInElif() => DoTest(
@"#define mycondition 1
#ifdef TEST
int ifDefFunc() { return 0; }
#elif mycondition == 1
#undef mycondition
#endif
#ifndef mycondition
int foo() { return 0; }
#endif
");

[Fact]
Expand Down Expand Up @@ -417,6 +679,17 @@ public Task IfExpressionDisableDefines() => DoTest(
#define foo fake_foo
#endif
int foo() { return 0; }
");

[Fact]
public Task DefineInElif() => DoTest(
@"#define TEST 1
#ifdef NON_EXISTS
#undef fake_foo
#elif TEST == 1
#define foo fake_foo
#endif
int fake_foo() { return 0; }
");

[Fact]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

int fake_foo() { return 0; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

int elseFunc() { return 0; }

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

int elseFunc() { return 0; }

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
int elifFunc() { return 0; }

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
inf elifFunc() { return 0; }


Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
int nestedElifFunc() { return 0; }


Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
int elifTwoFunc() { return 0; }

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
int elifOneFunc() { return 0; }

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
int ifFunc() { return 0; }

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
int elifFunc() { return 1; }

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

int ifdefFunc() { return 1; }

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
int x = 0;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
int main() { return 0; }


Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
int main() { return 0; }


Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

int main() { return 0; }


Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

int main() { return 0; }


Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@


int foo() { return 0; }

Loading
Loading