1 module tests.build;
2 
3 import unit_threaded;
4 import reggae;
5 
6 
7 void testIsLeaf() {
8     Target("tgt").isLeaf.shouldBeTrue;
9     Target("other", "", [Target("foo"), Target("bar")]).isLeaf.shouldBeFalse;
10     Target("implicits", "", [], [Target("foo")]).isLeaf.shouldBeFalse;
11 }
12 
13 
14 void testInOut() {
15     //Tests that specifying $in and $out in the command string gets substituted correctly
16     {
17         const target = Target("foo",
18                               "createfoo -o $out $in",
19                               [Target("bar.txt"), Target("baz.txt")]);
20         target.expandCommand.shouldEqual("createfoo -o foo bar.txt baz.txt");
21     }
22     {
23         const target = Target("tgt",
24                               "gcc -o $out $in",
25                               [
26                                   Target("src1.o", "gcc -c -o $out $in", [Target("src1.c")]),
27                                   Target("src2.o", "gcc -c -o $out $in", [Target("src2.c")])
28                                   ],
29             );
30         target.expandCommand.shouldEqual("gcc -o tgt src1.o src2.o");
31     }
32 
33     {
34         const target = Target(["proto.h", "proto.c"],
35                               "protocompile $out -i $in",
36                               [Target("proto.idl")]);
37         target.expandCommand.shouldEqual("protocompile proto.h proto.c -i proto.idl");
38     }
39 
40     {
41         const target = Target("lib1.a",
42                               "ar -o$out $in",
43                               [Target(["foo1.o", "foo2.o"], "cmd", [Target("tmp")]),
44                                Target("bar.o"),
45                                Target("baz.o")]);
46         target.expandCommand.shouldEqual("ar -olib1.a foo1.o foo2.o bar.o baz.o");
47     }
48 }
49 
50 
51 void testProject() {
52     const target = Target("foo",
53                           "makefoo -i $in -o $out -p $project",
54                           [Target("bar"), Target("baz")]);
55     target.expandCommand("/tmp").shouldEqual("makefoo -i /tmp/bar /tmp/baz -o foo -p /tmp");
56 }
57 
58 
59 void testMultipleOutputs() {
60     const target = Target(["foo.hpp", "foo.cpp"], "protocomp $in", [Target("foo.proto")]);
61     target.outputs.shouldEqual(["foo.hpp", "foo.cpp"]);
62     target.expandCommand("myproj").shouldEqual("protocomp myproj/foo.proto");
63 
64     const bld = Build(target);
65     bld.targets[0].outputs.shouldEqual(["foo.hpp", "foo.cpp"]);
66 }
67 
68 
69 void testEnclose() {
70 
71     Target("foo.o", "", [Target("foo.c")]).enclose(Target("theapp")).shouldEqual(
72             Target("objs/theapp.objs/foo.o", "", [Target("foo.c")]));
73 
74     Target("$builddir/bar.o", "", [Target("bar.c")]).enclose(Target("theapp")).shouldEqual(
75         Target("bar.o", "", [Target("bar.c")]));
76 
77     const leafTarget = Target("foo.c");
78     leafTarget.enclose(Target("theapp")).shouldEqual(leafTarget);
79 }
80 
81 
82 void testMultipleOutputsImplicits() {
83     const protoSrcs = Target([`$builddir/gen/protocol.c`, `$builddir/gen/protocol.h`],
84                              `./compiler $in`,
85                              [Target(`protocol.proto`)]);
86     const protoObj = Target(`$builddir/bin/protocol.o`,
87                             `gcc -o $out -c $builddir/gen/protocol.c`,
88                             [], [protoSrcs]);
89     const protoD = Target(`$builddir/gen/protocol.d`,
90                           `echo "extern(C) " > $out; cat $builddir/gen/protocol.h >> $out`,
91                           [], [protoSrcs]);
92     const app = Target(`app`,
93                        `dmd -of$out $in`,
94                        [Target(`src/main.d`), protoObj, protoD]);
95     const build = Build(app);
96 
97     const newProtoSrcs = Target([`gen/protocol.c`, `gen/protocol.h`],
98                                 `./compiler $in`,
99                                 [Target(`protocol.proto`)]);
100     const newProtoD = Target(`gen/protocol.d`,
101                              `echo "extern(C) " > $out; cat gen/protocol.h >> $out`,
102                              [], [newProtoSrcs]);
103 
104     build.targets.shouldEqual(
105         [Target("app", "dmd -of$out $in",
106                 [Target("src/main.d"),
107                  Target("bin/protocol.o", "gcc -o $out -c gen/protocol.c",
108                         [], [newProtoSrcs]),
109                  newProtoD])]
110         );
111 }