1---
2-- codelite/tests/test_codelite_config.lua
3-- Automated test suite for CodeLite project generation.
4-- Copyright (c) 2015 Manu Evans and the Premake project
5---
6
7
8	local suite = test.declare("codelite_cproj_config")
9	local p = premake
10	local codelite = p.modules.codelite
11
12---------------------------------------------------------------------------
13-- Setup/Teardown
14---------------------------------------------------------------------------
15
16	local wks, prj, cfg
17
18	function suite.setup()
19		p.action.set("codelite")
20		p.escaper(codelite.esc)
21		p.indent("  ")
22		wks = test.createWorkspace()
23	end
24
25	local function prepare()
26		prj = test.getproject(wks,1)
27		cfg = test.getconfig(prj, "Debug")
28	end
29
30
31	function suite.OnProjectCfg_Compiler()
32		prepare()
33		codelite.project.compiler(cfg)
34		test.capture [[
35      <Compiler Options="" C_Options="" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">
36      </Compiler>
37		]]
38	end
39
40	function suite.OnProjectCfg_Flags()
41		optimize "Debug"
42		exceptionhandling "Off"
43		rtti "Off"
44		pic "On"
45		symbols "On"
46		language "C++"
47		cppdialect "C++11"
48		flags { "NoBufferSecurityCheck" }
49		forceincludes { "forced_include1.h", "forced_include2.h" }
50		buildoptions { "-opt1", "-opt2" }
51		prepare()
52		codelite.project.compiler(cfg)
53		test.capture [[
54      <Compiler Options="-O0;-fPIC;-g;-std=c++11;-fno-exceptions;-fno-stack-protector;-fno-rtti;-include forced_include1.h;-include forced_include2.h;-opt1;-opt2" C_Options="-O0;-fPIC;-g;-include forced_include1.h;-include forced_include2.h;-opt1;-opt2" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">
55      </Compiler>
56		]]
57	end
58
59	function suite.OnProjectCfg_Includes()
60		includedirs { "dir/", "dir2" }
61		prepare()
62		codelite.project.compiler(cfg)
63		test.capture [[
64      <Compiler Options="" C_Options="" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">
65        <IncludePath Value="dir"/>
66        <IncludePath Value="dir2"/>
67      </Compiler>
68		]]
69	end
70
71	function suite.OnProjectCfg_SysIncludes()
72		sysincludedirs { "sysdir", "sysdir2/"}
73		prepare()
74		codelite.project.compiler(cfg)
75		test.capture [[
76      <Compiler Options="-isystem sysdir;-isystem sysdir2" C_Options="-isystem sysdir;-isystem sysdir2" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">
77      </Compiler>
78		]]
79	end
80
81
82	function suite.OnProjectCfg_Defines()
83		defines { "TEST", "DEF", "VAL=1", "ESCAPE=\"WITH SPACE\"" }
84		prepare()
85		codelite.project.compiler(cfg)
86		test.capture [[
87      <Compiler Options="" C_Options="" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">
88        <Preprocessor Value="TEST"/>
89        <Preprocessor Value="DEF"/>
90        <Preprocessor Value="VAL=1"/>
91        <Preprocessor Value="ESCAPE=&quot;WITH\ SPACE&quot;"/>
92      </Compiler>
93		]]
94	end
95
96	function suite.OnProjectCfg_Linker()
97		prepare()
98		codelite.project.linker(cfg)
99		test.capture [[
100      <Linker Required="yes" Options="">
101      </Linker>
102		]]
103	end
104
105	function suite.OnProjectCfg_LibPath()
106		libdirs { "test/", "test2" }
107		prepare()
108		codelite.project.linker(cfg)
109		test.capture [[
110      <Linker Required="yes" Options="">
111        <LibraryPath Value="test"/>
112        <LibraryPath Value="test2"/>
113      </Linker>
114		]]
115	end
116
117	function suite.OnProjectCfg_Libs()
118		links { "a", "b" }
119		prepare()
120		codelite.project.linker(cfg)
121		test.capture [[
122      <Linker Required="yes" Options="-la;-lb">
123      </Linker>
124		]]
125	end
126
127	-- TODO: test sibling lib project links
128
129
130	function suite.OnProjectCfg_ResCompiler()
131		prepare()
132		codelite.project.resourceCompiler(cfg)
133		test.capture [[
134      <ResourceCompiler Options="" Required="no"/>
135		]]
136	end
137
138	function suite.OnProjectCfg_ResInclude()
139		files { "x.rc" }
140		resincludedirs { "dir/" }
141		prepare()
142		codelite.project.resourceCompiler(cfg)
143		test.capture [[
144      <ResourceCompiler Options="" Required="yes">
145        <IncludePath Value="dir"/>
146      </ResourceCompiler>
147		]]
148	end
149
150	function suite.OnProjectCfg_ResRegularInclude()
151		files { "x.rc" }
152		includedirs { "regulardir/" }
153		prepare()
154		codelite.project.resourceCompiler(cfg)
155		test.capture [[
156      <ResourceCompiler Options="" Required="yes">
157        <IncludePath Value="regulardir"/>
158      </ResourceCompiler>
159		]]
160	end
161
162	function suite.OnProjectCfg_ResSysInclude()
163		files { "x.rc" }
164		sysincludedirs { "sysdir/" }
165		prepare()
166		codelite.project.resourceCompiler(cfg)
167		test.capture [[
168      <ResourceCompiler Options="" Required="yes">
169        <IncludePath Value="sysdir"/>
170      </ResourceCompiler>
171		]]
172	end
173
174	function suite.OnProjectCfg_General()
175		system "Windows"
176		prepare()
177		codelite.project.general(cfg)
178		test.capture [[
179      <General OutputFile="bin/Debug/MyProject.exe" IntermediateDirectory="obj/Debug" Command="bin/Debug/MyProject.exe" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>
180		]]
181	end
182
183	function suite.OnProjectCfg_Environment()
184		debugenvs { "ENV_ONE=1", "ENV_TWO=2" }
185		prepare()
186		codelite.project.environment(cfg)
187		test.capture(
188'      <Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;">\n' ..
189'        <![CDATA[ENV_ONE=1\n' ..
190'ENV_TWO=2]]>\n' ..
191'      </Environment>'
192		)
193	end
194
195	function suite.OnProjectCfg_EnvironmentEscaping()
196		debugenvs { "\"ENV\"=<&>" }
197		prepare()
198		codelite.project.environment(cfg)
199		test.capture(
200'      <Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;">\n' ..
201'        <![CDATA["ENV"=<&>]]>\n' ..
202'      </Environment>'
203		)
204	end
205
206	function suite.OnProjectCfg_Debugger()
207		prepare()
208		codelite.project.debugger(cfg)
209		test.capture [[
210      <Debugger IsRemote="no" RemoteHostName="" RemoteHostPort="" DebuggerPath="" IsExtended="no">
211        <DebuggerSearchPaths/>
212        <PostConnectCommands/>
213        <StartupCommands/>
214      </Debugger>
215		]]
216	end
217
218	function suite.OnProjectCfg_DebuggerOpts()
219		debugremotehost "localhost"
220		debugport(2345)
221		debugextendedprotocol(true)
222		debugsearchpaths { "search/", "path" }
223		debugconnectcommands { "connectcmd1", "cmd2" }
224		debugstartupcommands { "startcmd1", "cmd2" }
225		prepare()
226		codelite.project.debugger(cfg)
227		test.capture [[
228      <Debugger IsRemote="yes" RemoteHostName="localhost" RemoteHostPort="2345" DebuggerPath="" IsExtended="yes">
229        <DebuggerSearchPaths>search
230path</DebuggerSearchPaths>
231        <PostConnectCommands>connectcmd1
232cmd2</PostConnectCommands>
233        <StartupCommands>startcmd1
234cmd2</StartupCommands>
235      </Debugger>
236		]]
237	end
238
239	function suite.OnProjectCfg_DebuggerOptsEscaping()
240		debugremotehost "localhost"
241		debugport(2345)
242		debugextendedprotocol(true)
243		debugsearchpaths { "\"search\" && <path>" }
244		debugconnectcommands { "\"connect\" && <cmd>" }
245		debugstartupcommands { "\"start\" && <cmd>" }
246		prepare()
247		codelite.project.debugger(cfg)
248		test.capture [[
249      <Debugger IsRemote="yes" RemoteHostName="localhost" RemoteHostPort="2345" DebuggerPath="" IsExtended="yes">
250        <DebuggerSearchPaths>"search" &amp;&amp; &lt;path&gt;</DebuggerSearchPaths>
251        <PostConnectCommands>"connect" &amp;&amp; &lt;cmd&gt;</PostConnectCommands>
252        <StartupCommands>"start" &amp;&amp; &lt;cmd&gt;</StartupCommands>
253      </Debugger>
254		]]
255	end
256
257	function suite.OnProjectCfg_PreBuild()
258		prebuildcommands { "cmd0", "cmd1" }
259		prepare()
260		codelite.project.preBuild(prj)
261		test.capture [[
262      <PreBuild>
263        <Command Enabled="yes">cmd0</Command>
264        <Command Enabled="yes">cmd1</Command>
265      </PreBuild>
266		]]
267	end
268
269	function suite.OnProjectCfg_PreBuild_Escaped()
270		prebuildcommands {
271			"touch \"./build/copyright\" && echo OK",
272			"cat \"./lib/copyright\" >> \"./build/copyright\""
273		}
274		prepare()
275		codelite.project.preBuild(prj)
276		test.capture [[
277      <PreBuild>
278        <Command Enabled="yes">touch "./build/copyright" &amp;&amp; echo OK</Command>
279        <Command Enabled="yes">cat "./lib/copyright" &gt;&gt; "./build/copyright"</Command>
280      </PreBuild>
281		]]
282	end
283
284	function suite.OnProjectCfg_PostBuild()
285		postbuildcommands { "cmd0", "cmd1" }
286		prepare()
287		codelite.project.postBuild(prj)
288		test.capture [[
289      <PostBuild>
290        <Command Enabled="yes">cmd0</Command>
291        <Command Enabled="yes">cmd1</Command>
292      </PostBuild>
293		]]
294	end
295
296	function suite.OnProjectCfg_PostBuild_Escaped()
297		postbuildcommands {
298			"touch \"./build/copyright\" && echo OK",
299			"cat \"./lib/copyright\" >> \"./build/copyright\""
300		}
301		prepare()
302		codelite.project.postBuild(prj)
303		test.capture [[
304      <PostBuild>
305        <Command Enabled="yes">touch "./build/copyright" &amp;&amp; echo OK</Command>
306        <Command Enabled="yes">cat "./lib/copyright" &gt;&gt; "./build/copyright"</Command>
307      </PostBuild>
308		]]
309	end
310
311	-- TODO: test custom build
312
313
314	function suite.OnProjectCfg_AdditionalRules()
315		prepare()
316		codelite.project.additionalRules(prj)
317		test.capture [[
318      <AdditionalRules>
319        <CustomPostBuild/>
320        <CustomPreBuild/>
321      </AdditionalRules>
322		]]
323	end
324
325	function suite.OnProjectCfg_Completion()
326		language "C++"
327		cppdialect "C++11"
328		prepare()
329		codelite.project.completion(prj)
330		test.capture [[
331      <Completion EnableCpp11="yes" EnableCpp14="no">
332        <ClangCmpFlagsC/>
333        <ClangCmpFlags/>
334        <ClangPP/>
335        <SearchPaths/>
336      </Completion>
337		]]
338	end
339
340	function suite.OnProjectCfg_UnsignedCharOn()
341		unsignedchar "On"
342		prepare()
343		codelite.project.compiler(cfg)
344		test.capture [[
345      <Compiler Options="-funsigned-char" C_Options="-funsigned-char" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">
346      </Compiler>
347		]]
348	end
349
350
351	function suite.OnProjectCfg_UnsignedCharOff()
352		unsignedchar "Off"
353		prepare()
354		codelite.project.compiler(cfg)
355		test.capture [[
356      <Compiler Options="-fno-unsigned-char" C_Options="-fno-unsigned-char" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">
357      </Compiler>
358		]]
359	end
360