2 * Copyright 2012-2016 Nest Labs Inc. All Rights Reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 * This file implements functions that effect a simple, portable
20 * unit test suite framework.
28 #include <nlunit-test.h>
30 /* Function Prototypes */
32 static void def_log_name(struct _nlTestSuite* inSuite);
33 static void def_log_initialize(struct _nlTestSuite * inSuite, int inResult, int inWidth);
34 static void def_log_terminate(struct _nlTestSuite * inSuite, int inResult, int inWidth);
35 static void def_log_setup(struct _nlTestSuite* inSuite, int inResult, int inWidth);
36 static void def_log_test(struct _nlTestSuite *inSuite, int inWidth, int inIndex);
37 static void def_log_teardown(struct _nlTestSuite* inSuite, int inResult, int inWidth);
38 static void def_log_statTest(struct _nlTestSuite* inSuite);
39 static void def_log_statAssert(struct _nlTestSuite* inSuite);
40 static void csv_log_name(struct _nlTestSuite* inSuite);
41 static void csv_log_initialize(struct _nlTestSuite * inSuite, int inResult, int inWidth);
42 static void csv_log_terminate(struct _nlTestSuite * inSuite, int inResult, int inWidth);
43 static void csv_log_setup(struct _nlTestSuite* inSuite, int inResult, int inWidth);
44 static void csv_log_test(struct _nlTestSuite *inSuite, int inWidth, int inIndex);
45 static void csv_log_teardown(struct _nlTestSuite* inSuite, int inResult, int inWidth);
46 static void csv_log_statTest(struct _nlTestSuite* inSuite);
47 static void csv_log_statAssert(struct _nlTestSuite* inSuite);
49 /* Global Variables */
51 static nl_test_output_logger_t nl_test_logger_default = {
62 static nl_test_output_logger_t nl_test_logger_csv = {
73 /* Global Output Style Variable */
75 static const nl_test_output_logger_t *logger_output = &nl_test_logger_default;
77 static int isSentinel(const nlTest* inTests, size_t inIndex)
79 if (inTests[inIndex].name == NULL
80 && inTests[inIndex].function == NULL)
88 /* Human-readable (Default) Output Functions */
90 static void def_log_name(struct _nlTestSuite* inSuite)
92 printf("[ %s ]\n", inSuite->name);
95 static void def_log_initialize(struct _nlTestSuite * inSuite, int inResult, int inWidth)
97 printf("[ %s : %-*s ] : %s\n", inSuite->name, inWidth, "Initialize", inResult==FAILURE ? "FAILED" : "PASSED" );
99 static void def_log_terminate(struct _nlTestSuite * inSuite, int inResult, int inWidth)
101 printf("[ %s : %-*s ] : %s\n", inSuite->name, inWidth,"Terminate", inResult==FAILURE ? "FAILED" : "PASSED" );
104 static void def_log_setup(struct _nlTestSuite* inSuite, int inResult, int inWidth)
106 printf("[ %s : %-*s ] : %s\n", inSuite->name, inWidth, "Setup", inResult == FAILURE ? "FAILED" : "PASSED");
109 static void def_log_test(struct _nlTestSuite *inSuite, int inWidth, int inIndex)
111 printf("[ %s : %-*s ] : %s\n", inSuite->name, inWidth, inSuite->tests[inIndex].name, inSuite->flagError ? "FAILED" : "PASSED");
114 static void def_log_teardown(struct _nlTestSuite* inSuite, int inResult, int inWidth)
116 printf("[ %s : %-*s ] : %s\n", inSuite->name, inWidth, "TearDown", inResult == FAILURE ? "FAILED" : "PASSED");
119 static void def_log_statTest(struct _nlTestSuite* inSuite)
121 printf("Failed Tests: %d / %d\n", inSuite->failedTests, inSuite->runTests);
124 static void def_log_statAssert(struct _nlTestSuite* inSuite)
126 printf("Failed Asserts: %d / %d\n", inSuite->failedAssertions, inSuite->performedAssertions);
129 /* CSV Output Functions */
131 static void csv_log_name(struct _nlTestSuite* inSuite)
133 printf("'#0:','%s'\n", inSuite->name);
136 static void csv_log_initialize(struct _nlTestSuite * inSuite, int inResult, int inWidth)
138 printf("'#1:','%-*s','%s'\n", inWidth, "Initialize", inResult==FAILURE ? "FAILED" : "PASSED" );
141 static void csv_log_terminate(struct _nlTestSuite * inSuite, int inResult, int inWidth)
143 printf("'#5:','%-*s','%s'\n", inWidth,"Terminate", inResult==FAILURE ? "FAILED" : "PASSED" );
146 static void csv_log_setup(struct _nlTestSuite* inSuite, int inResult, int inWidth)
148 printf("'#2:','%-*s','%s'\n", inWidth, "Setup", inResult == FAILURE ? "FAILED" : "PASSED");
151 static void csv_log_test(struct _nlTestSuite *inSuite, int inWidth, int inIndex)
153 printf("'#3:','%-*s','%s'\n", inWidth, inSuite->tests[inIndex].name, inSuite->flagError ? "FAILED" : "PASSED");
156 static void csv_log_teardown(struct _nlTestSuite* inSuite, int inResult, int inWidth)
158 printf("'#4:','%-*s','%s'\n", inWidth, "Teardown", inResult == FAILURE ? "FAILED" : "PASSED");
161 static void csv_log_statTest(struct _nlTestSuite* inSuite)
163 printf("'#6:','%d','%d'\n", inSuite->failedTests, inSuite->runTests);
166 static void csv_log_statAssert(struct _nlTestSuite* inSuite)
168 printf("'#7:','%d','%d'\n", inSuite->failedAssertions, inSuite->performedAssertions);
171 void nlTestRunner(struct _nlTestSuite* inSuite, void* inContext)
176 logger_output->PrintName(inSuite);
178 /* Determine the maximum test name length */
180 for (i = 0; i < kTestSuiteMaxTests; i++)
182 if (isSentinel(inSuite->tests, i))
185 len = strlen(inSuite->tests[i].name);
190 inSuite->runTests = 0;
191 inSuite->failedTests = 0;
192 inSuite->performedAssertions = 0;
193 inSuite->failedAssertions = 0;
195 /* Run the tests and display the test and summary result */
196 if (inSuite->setup != NULL)
198 int resSetup = inSuite->setup(inContext);
199 logger_output->PrintSetup(inSuite,resSetup, max);
201 for (i = 0; i < kTestSuiteMaxTests; i++)
203 if (isSentinel(inSuite->tests, i))
206 if (inSuite->initialize != NULL)
208 int resInitialize = inSuite->initialize(inContext);
209 logger_output->PrintInitialize(inSuite,resInitialize, max);
212 inSuite->flagError = false;
213 inSuite->tests[i].function(inSuite, inContext);
214 inSuite->runTests += 1;
215 if (inSuite->flagError)
216 inSuite->failedTests += 1;
218 logger_output->PrintTest(inSuite, max, i);
220 if (inSuite->terminate != NULL)
222 int resTerminate = inSuite->terminate(inContext);
223 logger_output->PrintTerminate(inSuite,resTerminate, max);
226 if (inSuite->tear_down != NULL)
228 int resTeardown = inSuite->tear_down(inContext);
229 logger_output->PrintTeardown(inSuite,resTeardown, max);
233 int nlTestRunnerStats(struct _nlTestSuite* inSuite)
235 logger_output->PrintStatTests(inSuite);
236 logger_output->PrintStatAsserts(inSuite);
238 return 0 - inSuite->failedTests;
241 void nlTestSetOutputStyle(nlTestOutputStyle inStyle)
243 if (inStyle == OUTPUT_DEF)
245 logger_output = &nl_test_logger_default;
247 else if (inStyle == OUTPUT_CSV)
249 logger_output = &nl_test_logger_csv;
253 void nlTestSetLogger(const nlTestOutputLogger* inLogger)
255 logger_output = inLogger;