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                                 Yes.main,
22                                 No.allTogether,
23     );
24     const expected = Target("app",
25                             Command(CommandType.link,
26                                     assocList([assocEntry("flags",
27                                                           ["-L-L$FOO"])])),
28                             []);
29     actual.shouldEqual(expected);
30 }
31 
32 
33 
34 @("dubTarget with static library source with env var in path")
35 unittest {
36 
37     import reggae.rules.dub: dubTarget;
38     import reggae.config: setOptions;
39     import reggae.options: getOptions;
40     import std.typecons: Yes, No;
41     import std.algorithm: filter;
42     import std.array: split;
43 
44     setOptions(getOptions(["reggae", "/tmp/proj"]));
45 
46     DubInfo dubInfo;
47     dubInfo.packages = [DubPackage()];
48     dubInfo.packages[0].files = ["$LIB/liblua.a", "source/luad/foo.d"];
49     dubInfo.packages[0].importPaths = ["source"];
50     Target[] objects;
51     const actual = dubTarget!()(TargetName("app"),
52                                 dubInfo,
53                                 "-g -debug",
54                                 Yes.main,
55                                 No.allTogether,
56     );
57 
58     string[] empty;
59 
60     auto compileTarget = Target("source/luad.o",
61                                 Command(CommandType.compile,
62                                         assocList(
63                                              [
64                                                  assocEntry("includes", ["-Isource", "-I/tmp/proj"]),
65                                                  assocEntry("flags", ["-g", "-debug"]),
66                                                  assocEntry("stringImports", empty),
67                                                  assocEntry("DEPFILE", ["source/luad.o.dep"])
68                                              ])),
69                                  [Target("source/luad/foo.d")],
70     );
71 
72     const expected = Target("app",
73                             Command(CommandType.link,
74                                     assocList([assocEntry("flags",
75                                                           empty)])),
76                             [compileTarget, Target("$LIB/liblua.a")]);
77 
78     actual.shouldEqual(expected);
79     Options options;
80     options.dCompiler = "dmd";
81     options.projectPath = "/proj";
82     actual.shellCommand(options).split(" ").filter!(a => a != "").
83         shouldEqual(["dmd", "-ofapp", "source/luad.o", "$LIB/liblua.a"]);
84 }
85 
86 //FIXME: includes should not have all of them
87 @("versions from main package apply to all packages")
88 unittest {
89 
90     import reggae.rules.dub: dubTarget;
91     import reggae.config: options, setOptions;
92     import std.typecons: Yes, No;
93 
94     auto oldOptions = options;
95     scope(exit) setOptions(oldOptions);
96     auto newOptions = oldOptions.dup;
97     newOptions.perModule = true;
98     newOptions.projectPath = "/leproj";
99     setOptions(newOptions);
100 
101     DubInfo dubInfo;
102     dubInfo.packages = [DubPackage("myapp", "/path/myapp"), DubPackage("dep", "/path/dep")];
103     dubInfo.packages[0].files = ["src/file1.d", "src/file2.d"];
104     dubInfo.packages[0].importPaths = ["/path/myapp/src"];
105     dubInfo.packages[0].versions = ["foo", "bar"];
106     dubInfo.packages[0].dependencies = ["dep"];
107     dubInfo.packages[1].files = ["source/dep1.d", "source/dep2.d"];
108     dubInfo.packages[1].importPaths = ["/path/dep/source"];
109     dubInfo.packages[1].versions = ["quux"];
110 
111     Target[] objects;
112     const actual = dubTarget!()(TargetName("app"),
113                                 dubInfo,
114                                 "-g",
115                                 Yes.main,
116                                 No.allTogether,
117     );
118     string[] empty;
119     const expected =
120         Target("app",
121                Command(CommandType.link,
122                        assocList([assocEntry("flags",
123                                              empty)])),
124                [
125                    Target("path/myapp/src/file1.o",
126                           Command(CommandType.compile,
127                                   assocList([
128                                                 assocEntry("includes",
129                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
130                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
131                                                 assocEntry("stringImports", empty),
132                                                 assocEntry("DEPFILE", ["path/myapp/src/file1.o.dep"])
133                                                       ])),
134                           [Target("/path/myapp/src/file1.d")]),
135 
136                    Target("path/myapp/src/file2.o",
137                           Command(CommandType.compile,
138                                   assocList([
139                                                 assocEntry("includes",
140                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
141                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
142                                                 assocEntry("stringImports", empty),
143                                                              assocEntry("DEPFILE", ["path/myapp/src/file2.o.dep"])
144                                                 ])),
145                           [Target("/path/myapp/src/file2.d")]),
146 
147                    Target("path/dep/source/dep1.o",
148                           Command(CommandType.compile,
149                                   assocList([
150                                                 assocEntry("includes",
151                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
152                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
153                                                 assocEntry("stringImports", empty),
154                                                 assocEntry("DEPFILE", ["path/dep/source/dep1.o.dep"])
155                                                 ])),
156                           [Target("/path/dep/source/dep1.d")]),
157 
158                    Target("path/dep/source/dep2.o",
159                           Command(CommandType.compile,
160                                   assocList([
161                                                 assocEntry("includes",
162                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
163                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
164                                                 assocEntry("stringImports", empty),
165                                                 assocEntry("DEPFILE", ["path/dep/source/dep2.o.dep"])
166                                                 ])),
167                           [Target("/path/dep/source/dep2.d")]),
168 
169              ]
170         );
171     actual.shouldEqual(expected);
172 }
173 
174 
175 @("static library dubConfigurationTarget")
176 unittest {
177     auto oldOptions = options;
178     scope(exit) setOptions(oldOptions);
179 
180     auto newOptions = oldOptions.dup;
181     newOptions.perModule = false;
182     newOptions.projectPath = "/leproj";
183     setOptions(newOptions);
184 
185     auto dubInfo = DubInfo([DubPackage("myapp", "/path/myapp")]);
186     dubInfo.packages[0].files = ["src/file1.d", "src/file2.d"];
187     dubInfo.packages[0].targetType = "library";
188 
189     string[] empty;
190     const expected = Target("$builddir/libfoo.a",
191                             Command("ar rcs $out $in"),
192                             [Target("path/myapp/src.o",
193                                     Command(CommandType.compile,
194                                             assocList([
195                                                           assocEntry("includes", ["-I/leproj"]),
196                                                           assocEntry("flags", ["-g"]),
197                                                           assocEntry("stringImports", empty),
198                                                           assocEntry("DEPFILE", ["path/myapp/src.o.dep"]),
199                                                           ])),
200                                     [Target("/path/myapp/src/file1.d"), Target("/path/myapp/src/file2.d")])]);
201     dubTarget(TargetName("libfoo.a"), dubInfo, "-g").shouldEqual(expected);
202 }
203 
204 @("object files as dub srcFiles")
205 unittest {
206     auto oldOptions = options;
207     scope(exit) setOptions(oldOptions);
208 
209     auto newOptions = oldOptions.dup;
210     newOptions.perModule = false;
211     newOptions.projectPath = "/leproj";
212     setOptions(newOptions);
213 
214     auto dubInfo = DubInfo([DubPackage("myapp", "/path/myapp")]);
215     dubInfo.packages[0].files = ["src/file1.d", "src/file2.d", "bin/dep.o"];
216 
217     string[] empty;
218     const expected = Target("libfoo.a",
219                             Command(CommandType.link, assocList([assocEntry("flags", empty)])),
220                             [
221                                 Target("path/myapp/src.o",
222                                        Command(CommandType.compile,
223                                                assocList([
224                                                              assocEntry("includes", ["-I/leproj"]),
225                                                              assocEntry("flags", ["-g"]),
226                                                              assocEntry("stringImports", empty),
227                                                              assocEntry("DEPFILE", ["path/myapp/src.o.dep"]),
228                                                          ])),
229                                        [Target("/path/myapp/src/file1.d"), Target("/path/myapp/src/file2.d")]),
230 
231                                 Target("/path/myapp/bin/dep.o"),
232                             ]);
233     dubTarget(TargetName("libfoo.a"), dubInfo, "-g").shouldEqual(expected);
234 }