Skip to content

Commit 7f47109

Browse files
authored
Merge pull request #77 from vovythevov/FixDeserialazation-MultipleArgs
Fix deserialization multiple args
2 parents 6c715ff + 768beb7 commit 7f47109

File tree

8 files changed

+492
-70
lines changed

8 files changed

+492
-70
lines changed

GenerateCLP/GenerateCLP.cxx

Lines changed: 150 additions & 34 deletions
Large diffs are not rendered by default.

GenerateCLP/Testing/CLPExample1/CMakeLists.txt

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,11 @@
11
cmake_minimum_required(VERSION 2.8.6)
2-
project(CLPExample1)
32

4-
find_package(GenerateCLP NO_MODULE REQUIRED)
5-
include(${GenerateCLP_USE_FILE})
3+
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMake/GenerateCLPTestMacros.cmake)
4+
GenerateCLP_TEST_PROJECT(
5+
NAME CLPExample1
6+
)
67

7-
#-----------------------------------------------------------------------------
8-
if(GenerateCLP_USE_JSONCPP)
9-
set(CMAKE_MODULE_PATH ${JsonCpp_CMAKE_MODULE_PATH} ${CMAKE_MODULE_PATH}) # Needed to locate FindJsonCpp.cmake
10-
find_package(JsonCpp REQUIRED)
11-
include_directories(${JsonCpp_INCLUDE_DIRS})
12-
endif()
13-
14-
set(_additional_link_libraries)
15-
if(GenerateCLP_USE_JSONCPP)
16-
list(APPEND _additional_link_libraries ${JsonCpp_LIBRARIES})
17-
endif()
18-
if(GenerateCLP_USE_SERIALIZER)
19-
list(APPEND _additional_link_libraries ${ParameterSerializer_LIBRARIES})
20-
endif()
21-
22-
#-----------------------------------------------------------------------------
23-
# Build
24-
#-----------------------------------------------------------------------------
25-
26-
set(${PROJECT_NAME}_SOURCE ${PROJECT_NAME}.cxx)
27-
GENERATECLP(${PROJECT_NAME}_SOURCE ${PROJECT_NAME}.xml)
28-
add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCE})
29-
if(_additional_link_libraries)
30-
target_link_libraries(${PROJECT_NAME} ${_additional_link_libraries})
31-
endif()
32-
#-----------------------------------------------------------------------------
338
# Test
34-
#-----------------------------------------------------------------------------
35-
include(CTest)
36-
37-
set(TEMP ${PROJECT_BINARY_DIR}/Testing/Temporary)
38-
file(MAKE_DIRECTORY ${TEMP})
399

4010
if(GenerateCLP_USE_SERIALIZER)
4111
# Test normal command line exec + serialization at the end
@@ -69,8 +39,8 @@ if(GenerateCLP_USE_SERIALIZER)
6939
COMMAND $<TARGET_FILE:${PROJECT_NAME}>
7040
--deserialize ./GenerateCLPSerializer-${PROJECT_NAME}-Test1.json
7141
--serialize ./GenerateCLPSerializer-${PROJECT_NAME}-Test3.json
72-
-s 2112
73-
-l 0.001,0.001,0.0005,0.0003
42+
--spatialsamples 2112
43+
--learningrate 0.001,0.001,0.0005,0.0003
7444
2
7545
Head.mha
7646
ProgrammingHead.mha
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
2+
#include "CLPTestMultipleCLP.h"
3+
4+
#include <vector>
5+
6+
template<class T>
7+
bool Compare(T* expectedValues,
8+
unsigned int expectedNumberOfValues,
9+
std::vector<T>& values
10+
)
11+
{
12+
bool success = values.size() == expectedNumberOfValues;
13+
if (!success)
14+
{
15+
std::cerr << "Wrong number of values, got: " << values.size()
16+
<< " expected: " << expectedNumberOfValues << std::endl;
17+
return false;
18+
}
19+
20+
for (size_t i = 0; i < expectedNumberOfValues; ++i)
21+
{
22+
success &= values[i] == expectedValues[i];
23+
if (!success)
24+
{
25+
std::cerr << "Wrong values, got: " << values[i]
26+
<< " expected: " << expectedValues[i] << std::endl;
27+
}
28+
}
29+
return success;
30+
}
31+
32+
//-----------------------------------------------------------------------------
33+
int main(int argc, char * argv[])
34+
{
35+
PARSE_ARGS;
36+
37+
const unsigned int numberOfExpectedValues = 6;
38+
int expectedValues[numberOfExpectedValues] = {1, 2, 3, 4, 5, 6};
39+
int negativeExpectedValues[numberOfExpectedValues] = {-1, -2, -3, -4, -5, -6};
40+
std::string stringExpectedValues[numberOfExpectedValues] = {"1", "2", "3", "4", "5", "6"};
41+
std::string negativeStringExpectedValues[numberOfExpectedValues] = {"-1", "-2", "-3", "-4", "-5", "-6"};
42+
43+
int floatVectorSizes[3] = {1, 3, 2};
44+
float floatExpectedValues[3][3] = {
45+
{1, 0, 0},
46+
{2, 3, 4},
47+
{5, 6, 0}
48+
};
49+
int negativeFloatVectorSizes[3] = {2, 1, 3};
50+
float negativeFloatExpectedValues[3][3] = {
51+
{-1, -2, 0},
52+
{-3, 0, 0},
53+
{-4, -5, -6}
54+
};
55+
56+
bool success = false;
57+
if (IntList.size() > 0)
58+
{
59+
success = Compare<int>(
60+
TestCommandLineOverWrite ? negativeExpectedValues : expectedValues,
61+
numberOfExpectedValues,
62+
IntList);
63+
}
64+
else if (FileList.size() > 0)
65+
{
66+
success = Compare<std::string>(
67+
TestCommandLineOverWrite ? negativeStringExpectedValues : stringExpectedValues,
68+
numberOfExpectedValues,
69+
FileList);
70+
}
71+
else if (DirList.size() > 0)
72+
{
73+
success = Compare<std::string>(
74+
TestCommandLineOverWrite ? negativeStringExpectedValues : stringExpectedValues,
75+
numberOfExpectedValues,
76+
DirList);
77+
}
78+
else if (ImageList.size() > 0)
79+
{
80+
success = Compare<std::string>(
81+
TestCommandLineOverWrite ? negativeStringExpectedValues : stringExpectedValues,
82+
numberOfExpectedValues,
83+
ImageList);
84+
}
85+
else if (GeometryList.size() > 0)
86+
{
87+
success = Compare<std::string>(
88+
TestCommandLineOverWrite ? negativeStringExpectedValues : stringExpectedValues,
89+
numberOfExpectedValues,
90+
GeometryList);
91+
}
92+
else if (PointList.size() > 0)
93+
{
94+
success = PointList.size() == 3;
95+
if (!success)
96+
{
97+
std::cerr << "Wrong number of values, got: " << PointList.size()
98+
<< " expected: " << 3 << std::endl;
99+
return EXIT_FAILURE;
100+
}
101+
for (size_t i = 0; i < 3; ++i)
102+
{
103+
success &=
104+
Compare<float>(
105+
TestCommandLineOverWrite ? negativeFloatExpectedValues[i] : floatExpectedValues[i],
106+
TestCommandLineOverWrite ? negativeFloatVectorSizes[i] : floatVectorSizes[i],
107+
PointList[i]);
108+
}
109+
}
110+
else if (PointFileList.size() > 0)
111+
{
112+
success = Compare<std::string>(
113+
TestCommandLineOverWrite ? negativeStringExpectedValues : stringExpectedValues,
114+
numberOfExpectedValues,
115+
PointFileList);
116+
}
117+
else if (RegionList.size() > 0)
118+
{
119+
success = RegionList.size() == 3;
120+
if (!success)
121+
{
122+
std::cerr << "Wrong number of values, got: " << RegionList.size()
123+
<< " expected: " << 3 << std::endl;
124+
return EXIT_FAILURE;
125+
}
126+
for (size_t i = 0; i < 3; ++i)
127+
{
128+
success &=
129+
Compare<float>(
130+
TestCommandLineOverWrite ? negativeFloatExpectedValues[i] : floatExpectedValues[i],
131+
TestCommandLineOverWrite ? negativeFloatVectorSizes[i] : floatVectorSizes[i],
132+
RegionList[i]);
133+
}
134+
}
135+
136+
if (success)
137+
{
138+
return EXIT_SUCCESS;
139+
}
140+
std::cerr << "Fail" << std::endl;
141+
return EXIT_FAILURE;
142+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<executable>
3+
<category>Testing</category>
4+
<title>CLP Test multiple</title>
5+
<index>1</index>
6+
<version>1.0</version>
7+
<parameters>
8+
<integer multiple="true">
9+
<name>IntList</name>
10+
<label>Int List</label>
11+
<channel>input</channel>
12+
<longflag>--int</longflag>
13+
</integer>
14+
<file multiple="true">
15+
<name>FileList</name>
16+
<label>file List</label>
17+
<channel>input</channel>
18+
<longflag>--file</longflag>
19+
</file>
20+
<directory multiple="true">
21+
<name>DirList</name>
22+
<label>Dir List</label>
23+
<channel>input</channel>
24+
<longflag>--dir</longflag>
25+
</directory>
26+
<image multiple="true">
27+
<name>ImageList</name>
28+
<label>file List</label>
29+
<channel>input</channel>
30+
<longflag>--image</longflag>
31+
</image>
32+
<geometry multiple="true">
33+
<name>GeometryList</name>
34+
<label>Geometry List</label>
35+
<channel>input</channel>
36+
<longflag>--geo</longflag>
37+
</geometry>
38+
<point multiple="true">
39+
<name>PointList</name>
40+
<label>Point List</label>
41+
<longflag>--point</longflag>
42+
</point>
43+
<pointfile multiple="true">
44+
<name>PointFileList</name>
45+
<label>Point file List</label>
46+
<channel>input</channel>
47+
<longflag>--pointFile</longflag>
48+
</pointfile>
49+
<region multiple="true">
50+
<name>RegionList</name>
51+
<label>ROI List</label>
52+
<channel>input</channel>
53+
<longflag>--roi</longflag>
54+
</region>
55+
56+
<boolean>
57+
<name>TestInterruption</name>
58+
<label>To make sure we can have a random flag in the middle of multiple flag list.</label>
59+
<channel>input</channel>
60+
<longflag>--interruptionFlag</longflag>
61+
<default>False</default>
62+
</boolean>
63+
64+
<boolean>
65+
<name>TestCommandLineOverWrite</name>
66+
<label>To make sure we can overwrite the JSON with the command line.</label>
67+
<channel>input</channel>
68+
<longflag>--testCommandLineOverWrite</longflag>
69+
<default>False</default>
70+
</boolean>
71+
</parameters>
72+
</executable>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
cmake_minimum_required(VERSION 2.8.6)
2+
3+
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMake/GenerateCLPTestMacros.cmake)
4+
GenerateCLP_TEST_PROJECT(
5+
NAME CLPTestMultiple
6+
)
7+
8+
# Tests
9+
if(GenerateCLP_USE_SERIALIZER)
10+
list(APPEND FLAGS_TO_TEST
11+
--int
12+
--file
13+
--dir
14+
--image
15+
--geo
16+
--point
17+
--pointFile
18+
--roi
19+
)
20+
foreach(flag ${FLAGS_TO_TEST})
21+
add_test(NAME GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test1
22+
COMMAND $<TARGET_FILE:${PROJECT_NAME}>
23+
${flag} 1
24+
${flag} 2,3,4
25+
--interruptionFlag
26+
${flag} 5,6
27+
--serialize ./GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test1.json
28+
WORKING_DIRECTORY ${TEMP}
29+
)
30+
31+
# Test deserialization with no other args
32+
add_test(NAME GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test2
33+
COMMAND $<TARGET_FILE:${PROJECT_NAME}>
34+
--deserialize ./GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test1.json
35+
WORKING_DIRECTORY ${TEMP}
36+
)
37+
set_tests_properties( GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test2
38+
PROPERTIES DEPENDS GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test1)
39+
40+
# Test deserialize with new arguments
41+
add_test(NAME GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test3
42+
COMMAND $<TARGET_FILE:${PROJECT_NAME}>
43+
--testCommandLineOverWrite
44+
--deserialize ./GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test1.json
45+
${flag} -1,-2
46+
--interruptionFlag
47+
${flag} -3
48+
${flag} -4,-5,-6
49+
WORKING_DIRECTORY ${TEMP}
50+
)
51+
set_tests_properties( GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test3
52+
PROPERTIES DEPENDS GenerateCLPSerializer-${PROJECT_NAME}${flag}-Test1)
53+
endforeach()
54+
55+
endif()

GenerateCLP/Testing/CMake/GenerateCLPTestMacros.cmake

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,51 @@ function(print_command_as_string command)
1111
endif()
1212
endfunction()
1313

14+
# --------------------------------------------------------------------------
15+
# Macro used to generate CLIs to test GenerateCLP with
16+
macro(GenerateCLP_TEST_PROJECT)
17+
include(CMakeParseArguments)
18+
19+
set(options)
20+
set(oneValueArgs NAME)
21+
set(multiValueArgs)
22+
cmake_parse_arguments(TEST_CLI "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
23+
24+
project(${TEST_CLI_NAME})
25+
26+
find_package(GenerateCLP NO_MODULE REQUIRED)
27+
include(${GenerateCLP_USE_FILE})
28+
29+
#-----------------------------------------------------------------------------
30+
if(GenerateCLP_USE_JSONCPP)
31+
set(CMAKE_MODULE_PATH ${JsonCpp_CMAKE_MODULE_PATH} ${CMAKE_MODULE_PATH}) # Needed to locate FindJsonCpp.cmake
32+
find_package(JsonCpp REQUIRED)
33+
include_directories(${JsonCpp_INCLUDE_DIRS})
34+
endif()
35+
36+
set(_additional_link_libraries)
37+
if(GenerateCLP_USE_JSONCPP)
38+
list(APPEND _additional_link_libraries ${JsonCpp_LIBRARIES})
39+
endif()
40+
if(GenerateCLP_USE_SERIALIZER)
41+
list(APPEND _additional_link_libraries ${ParameterSerializer_LIBRARIES})
42+
endif()
43+
44+
#-----------------------------------------------------------------------------
45+
# Build
46+
#-----------------------------------------------------------------------------
47+
48+
set(${PROJECT_NAME}_SOURCE ${PROJECT_NAME}.cxx)
49+
GENERATECLP(${PROJECT_NAME}_SOURCE ${PROJECT_NAME}.xml)
50+
add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCE})
51+
if(_additional_link_libraries)
52+
target_link_libraries(${PROJECT_NAME} ${_additional_link_libraries})
53+
endif()
54+
#-----------------------------------------------------------------------------
55+
# Test
56+
#-----------------------------------------------------------------------------
57+
include(CTest)
58+
59+
set(TEMP ${PROJECT_BINARY_DIR}/Testing/Temporary)
60+
file(MAKE_DIRECTORY ${TEMP})
61+
endmacro()

GenerateCLP/Testing/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,8 @@ set(_previous_test "NODEPENDS")
4444
generateclp_add_test(CLPExample1 Configure)
4545
generateclp_add_test(CLPExample1 Build)
4646
generateclp_add_test(CLPExample1 Test)
47+
48+
set(_previous_test "NODEPENDS")
49+
generateclp_add_test(CLPTestMultiple Configure)
50+
generateclp_add_test(CLPTestMultiple Build)
51+
generateclp_add_test(CLPTestMultiple Test)

0 commit comments

Comments
 (0)