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!()(ExeName("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!()(ExeName("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 
102     DubInfo dubInfo;
103     dubInfo.packages = [DubPackage("myapp", "/path/myapp"), DubPackage("dep", "/path/dep")];
104     dubInfo.packages[0].files = ["src/file1.d", "src/file2.d"];
105     dubInfo.packages[0].importPaths = ["/path/myapp/src"];
106     dubInfo.packages[0].versions = ["foo", "bar"];
107     dubInfo.packages[0].dependencies = ["dep"];
108     dubInfo.packages[1].files = ["source/dep1.d", "source/dep2.d"];
109     dubInfo.packages[1].importPaths = ["/path/dep/source"];
110     dubInfo.packages[1].versions = ["quux"];
111 
112     Target[] objects;
113     const actual = dubTarget!()(ExeName("app"),
114                                 dubInfo,
115                                 "-g",
116                                 Yes.main,
117                                 No.allTogether,
118     );
119     string[] empty;
120     const expected =
121         Target("app",
122                Command(CommandType.link,
123                        assocList([assocEntry("flags",
124                                              empty)])),
125                [
126                    Target("path/myapp/src/file1.o",
127                           Command(CommandType.compile,
128                                   assocList([
129                                                 assocEntry("includes",
130                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
131                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
132                                                 assocEntry("stringImports", empty),
133                                                 assocEntry("DEPFILE", ["path/myapp/src/file1.o.dep"])
134                                                       ])),
135                           [Target("/path/myapp/src/file1.d")]),
136 
137                    Target("path/myapp/src/file2.o",
138                           Command(CommandType.compile,
139                                   assocList([
140                                                 assocEntry("includes",
141                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
142                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
143                                                 assocEntry("stringImports", empty),
144                                                              assocEntry("DEPFILE", ["path/myapp/src/file2.o.dep"])
145                                                 ])),
146                           [Target("/path/myapp/src/file2.d")]),
147 
148                    Target("path/dep/source/dep1.o",
149                           Command(CommandType.compile,
150                                   assocList([
151                                                 assocEntry("includes",
152                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
153                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
154                                                 assocEntry("stringImports", empty),
155                                                 assocEntry("DEPFILE", ["path/dep/source/dep1.o.dep"])
156                                                 ])),
157                           [Target("/path/dep/source/dep1.d")]),
158 
159                    Target("path/dep/source/dep2.o",
160                           Command(CommandType.compile,
161                                   assocList([
162                                                 assocEntry("includes",
163                                                            ["-I/path/myapp/src", "-I/path/dep/source", "-I/leproj"]),
164                                                 assocEntry("flags", ["-version=foo", "-version=bar", "-version=quux", "-g"]),
165                                                 assocEntry("stringImports", empty),
166                                                 assocEntry("DEPFILE", ["path/dep/source/dep2.o.dep"])
167                                                 ])),
168                           [Target("/path/dep/source/dep2.d")]),
169 
170              ]
171         );
172     actual.shouldEqual(expected);
173 }