1 module tests.ut.rules.dub;
2 
3 
4 import reggae;
5 import unit_threaded;
6 
7 
8 @("dubTarget with lflags")
9 unittest {
10 
11     import reggae.rules.dub: dubTarget;
12     import std.typecons: Yes, No;
13 
14     DubInfo dubInfo;
15     dubInfo.packages = [DubPackage()];
16     dubInfo.packages[0].lflags = ["-L$FOO"];
17     Target[] objects;
18     const actual = dubTarget(TargetName("app"),
19                              dubInfo,
20                              "-g -debug",
21                              [],
22                              Yes.main,
23                              CompilationMode.all,
24     );
25     const expected = Target("app",
26                             Command(CommandType.link,
27                                     assocList([assocEntry("flags",
28                                                           ["-m64", "-L-L$FOO"])])),
29                             []);
30     actual.shouldEqual(expected);
31 }
32 
33 
34 
35 @("dubTarget with static library source with env var in path")
36 unittest {
37 
38     import reggae.rules.dub: dubTarget;
39     import reggae.config: setOptions;
40     import reggae.options: getOptions;
41     import std.typecons: Yes, No;
42     import std.algorithm: filter;
43     import std.array: split;
44 
45     setOptions(getOptions(["reggae", "-b", "ninja", "/tmp/proj"]));
46 
47     DubInfo dubInfo;
48     dubInfo.packages = [DubPackage()];
49     dubInfo.packages[0].files = ["$LIB/liblua.a", "source/luad/foo.d"];
50     dubInfo.packages[0].importPaths = ["source"];
51     Target[] objects;
52     const actual = dubTarget(TargetName("app"),
53                              dubInfo,
54                              "-g -debug",
55                              [],
56                              Yes.main,
57                              CompilationMode.options,
58     );
59 
60     string[] empty;
61 
62     auto compileTarget = Target("source/luad.o",
63                                 Command(CommandType.compile,
64                                         assocList(
65                                              [
66                                                  assocEntry("includes", ["-I/tmp/proj", "-Isource"]),
67                                                  assocEntry("flags", ["-m64", "-g", "-debug"]),
68                                                  assocEntry("stringImports", empty),
69                                                  assocEntry("DEPFILE", ["source/luad.o.dep"])
70                                              ])),
71                                  [Target("source/luad/foo.d")],
72     );
73 
74     const expected = Target("app",
75                             Command(CommandType.link,
76                                     assocList([assocEntry("flags",
77                                                           ["-m64"])])),
78                             [compileTarget, Target("$LIB/liblua.a")]);
79 
80     actual.shouldEqual(expected);
81     Options options;
82     options.dCompiler = "dmd";
83     options.projectPath = "/proj";
84     actual.shellCommand(options).split(" ").filter!(a => a != "").
85         shouldEqual(["dmd", "-ofapp", "-m64", "source/luad.o", "$LIB/liblua.a"]);
86 }
87 
88 
89 @("static library dubConfigurationTarget")
90 unittest {
91     auto oldOptions = options;
92     scope(exit) setOptions(oldOptions);
93 
94     auto newOptions = oldOptions.dup;
95     newOptions.perModule = false;
96     newOptions.projectPath = "/leproj";
97     setOptions(newOptions);
98 
99     auto dubInfo = DubInfo([DubPackage("myapp", "/path/myapp")]);
100     dubInfo.packages[0].files = ["src/file1.d", "src/file2.d"];
101     dubInfo.packages[0].targetType = TargetType.library;
102 
103     string[] empty;
104     const expected = Target("$builddir/libfoo.a",
105                             Command("ar rcs $out $in"),
106                             [Target("path/myapp/src.o",
107                                     Command(CommandType.compile,
108                                             assocList([
109                                                           assocEntry("includes", ["-I/leproj"]),
110                                                           assocEntry("flags", ["-m64", "-g"]),
111                                                           assocEntry("stringImports", empty),
112                                                           assocEntry("DEPFILE", ["path/myapp/src.o.dep"]),
113                                                           ])),
114                                     [Target("/path/myapp/src/file1.d"), Target("/path/myapp/src/file2.d")])]);
115     dubTarget(TargetName("libfoo.a"), dubInfo, "-g").shouldEqual(expected);
116 }
117 
118 
119 @("object files as dub srcFiles")
120 unittest {
121     auto oldOptions = options;
122     scope(exit) setOptions(oldOptions);
123 
124     auto newOptions = oldOptions.dup;
125     newOptions.perModule = false;
126     newOptions.projectPath = "/leproj";
127     setOptions(newOptions);
128 
129     auto dubInfo = DubInfo([DubPackage("myapp", "/path/myapp")]);
130     dubInfo.packages[0].files = ["src/file1.d", "src/file2.d", "bin/dep.o"];
131 
132     string[] empty;
133     const expected = Target("libfoo.a",
134                             Command(CommandType.link, assocList([assocEntry("flags", ["-m64"])])),
135                             [
136                                 Target("path/myapp/src.o",
137                                        Command(CommandType.compile,
138                                                assocList([
139                                                              assocEntry("includes", ["-I/leproj"]),
140                                                              assocEntry("flags", ["-m64", "-g"]),
141                                                              assocEntry("stringImports", empty),
142                                                              assocEntry("DEPFILE", ["path/myapp/src.o.dep"]),
143                                                          ])),
144                                        [Target("/path/myapp/src/file1.d"), Target("/path/myapp/src/file2.d")]),
145 
146                                 Target("/path/myapp/bin/dep.o"),
147                             ]);
148     dubTarget(TargetName("libfoo.a"), dubInfo, "-g").shouldEqual(expected);
149 }