summaryrefslogtreecommitdiffstats
path: root/tools/slang-unit-test/unit-test-command-line-args.cpp
blob: 52e4226ebc393c2aa000041c983e208690cef6a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// unit-test-command-line-args.cpp

#include "../../source/compiler-core/slang-command-line-args.h"
#include "unit-test/slang-unit-test.h"

using namespace Slang;

SLANG_UNIT_TEST(commandLineArgs)
{
    RefPtr<CommandLineContext> context = new CommandLineContext;


    // Simple scoped version
    {
        CommandLineArgs args(context);
        DownstreamArgs downstreamArgs(context);

        DiagnosticSink sink(context->getSourceManager(), nullptr);

        const char* inArgs[] = {
            "-Xa...",
            "-blah",
            "10",
            "-X.",
        };

        args.setArgs(inArgs, SLANG_COUNT_OF(inArgs));

        SLANG_CHECK(SLANG_SUCCEEDED(
            downstreamArgs.stripDownstreamArgs(args, DownstreamArgs::Flag::AllowNewNames, &sink)));

        const char* aArgs[] = {"-blah", "10"};

        SLANG_CHECK(downstreamArgs.getArgsByName("a").hasArgs(aArgs, SLANG_COUNT_OF(aArgs)));
        SLANG_CHECK(args.getArgCount() == 0 && sink.getErrorCount() == 0);
    }

    // Leaving off terminating -X. is ok
    {
        CommandLineArgs args(context);
        DownstreamArgs downstreamArgs(context);

        DiagnosticSink sink(context->getSourceManager(), nullptr);

        const char* inArgs[] = {
            "-Xa...",
            "-blah",
            "10",
        };

        args.setArgs(inArgs, SLANG_COUNT_OF(inArgs));

        SLANG_CHECK(SLANG_SUCCEEDED(
            downstreamArgs.stripDownstreamArgs(args, DownstreamArgs::Flag::AllowNewNames, &sink)));

        const char* aArgs[] = {"-blah", "10"};

        SLANG_CHECK(downstreamArgs.getArgsByName("a").hasArgs(aArgs, SLANG_COUNT_OF(aArgs)));
        SLANG_CHECK(args.getArgCount() == 0 && sink.getErrorCount() == 0);
    }

    // Having a nesting

    {
        CommandLineArgs args(context);
        DownstreamArgs downstreamArgs(context);

        DiagnosticSink sink(context->getSourceManager(), nullptr);

        const char* inArgs[] = {
            "-something",
            "andAnother",
            "-Xa...",
            "-blah",
            "-Xb...",
            "-hey",
            "-X.",
            "10",
            "-X.",
            "-Xc",
            "somethingForC",
        };

        args.setArgs(inArgs, SLANG_COUNT_OF(inArgs));

        SLANG_CHECK(SLANG_SUCCEEDED(
            downstreamArgs.stripDownstreamArgs(args, DownstreamArgs::Flag::AllowNewNames, &sink)));

        const char* aArgs[] = {"-blah", "-Xb...", "-hey", "-X.", "10"};

        const char* cArgs[] = {
            "somethingForC",
        };

        const char* mainArgs[] = {
            "-something",
            "andAnother",
        };

        SLANG_CHECK(downstreamArgs.getArgsByName("a").hasArgs(aArgs, SLANG_COUNT_OF(aArgs)));
        SLANG_CHECK(downstreamArgs.getArgsByName("c").hasArgs(cArgs, SLANG_COUNT_OF(cArgs)));

        SLANG_CHECK(args.hasArgs(mainArgs, SLANG_COUNT_OF(mainArgs)) && sink.getErrorCount() == 0);
    }
}