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