/* Copyright (c) 2010 James Grenning and Contributed to Unity Project * ========================================== * Unity Project - A Test Framework for C * Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams * [Released under MIT License. Please refer to license.txt for details] * ========================================== */ #include "unity_fixture.h" #include "unity_internals.h" #include struct UNITY_FIXTURE_T UnityFixture; /* If you decide to use the function pointer approach. * Build with -D UNITY_OUTPUT_CHAR=outputChar and include * int (*outputChar)(int) = putchar; */ void setUp(void) { /*does nothing*/ } void tearDown(void) { /*does nothing*/ } static void announceTestRun(unsigned int runNumber) { UnityPrint("Unity test run "); UnityPrintNumberUnsigned(runNumber+1); UnityPrint(" of "); UnityPrintNumberUnsigned(UnityFixture.RepeatCount); UNITY_PRINT_EOL(); } int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)) { int result = UnityGetCommandLineOptions(argc, argv); unsigned int r; if (result != 0) return result; for (r = 0; r < UnityFixture.RepeatCount; r++) { UnityBegin(argv[0]); announceTestRun(r); runAllTests(); if (!UnityFixture.Verbose) UNITY_PRINT_EOL(); UnityEnd(); } return (int)Unity.TestFailures; } static int selected(const char* filter, const char* name) { if (filter == 0) return 1; return strstr(name, filter) ? 1 : 0; } static int testSelected(const char* test) { return selected(UnityFixture.NameFilter, test); } static int groupSelected(const char* group) { return selected(UnityFixture.GroupFilter, group); } void UnityTestRunner(unityfunction* setup, unityfunction* testBody, unityfunction* teardown, const char* printableName, const char* group, const char* name, const char* file, unsigned int line) { if (testSelected(name) && groupSelected(group)) { Unity.TestFile = file; Unity.CurrentTestName = printableName; Unity.CurrentTestLineNumber = line; if (UnityFixture.Verbose) { UnityPrint(printableName); #ifndef UNITY_REPEAT_TEST_NAME Unity.CurrentTestName = NULL; #endif } else if (UnityFixture.Silent) { /* Do Nothing */ } else { UNITY_OUTPUT_CHAR('.'); } Unity.NumberOfTests++; UnityPointer_Init(); UNITY_EXEC_TIME_START(); if (TEST_PROTECT()) { setup(); testBody(); } if (TEST_PROTECT()) { teardown(); } if (TEST_PROTECT()) { UnityPointer_UndoAllSets(); } UnityConcludeFixtureTest(); } } void UnityIgnoreTest(const char* printableName, const char* group, const char* name) { if (testSelected(name) && groupSelected(group)) { Unity.NumberOfTests++; Unity.TestIgnores++; if (UnityFixture.Verbose) { UnityPrint(printableName); UNITY_PRINT_EOL(); } else if (UnityFixture.Silent) { /* Do Nothing */ } else { UNITY_OUTPUT_CHAR('!'); } } } /*-------------------------------------------------------- */ /*Automatic pointer restoration functions */ struct PointerPair { void** pointer; void* old_value; }; static struct PointerPair pointer_store[UNITY_MAX_POINTERS]; static int pointer_index = 0; void UnityPointer_Init(void) { pointer_index = 0; } void UnityPointer_Set(void** pointer, void* newValue, UNITY_LINE_TYPE line) { if (pointer_index >= UNITY_MAX_POINTERS) { UNITY_TEST_FAIL(line, "Too many pointers set"); } else { pointer_store[pointer_index].pointer = pointer; pointer_store[pointer_index].old_value = *pointer; *pointer = newValue; pointer_index++; } } void UnityPointer_UndoAllSets(void) { while (pointer_index > 0) { pointer_index--; *(pointer_store[pointer_index].pointer) = pointer_store[pointer_index].old_value; } } int UnityGetCommandLineOptions(int argc, const char* argv[]) { int i; UnityFixture.Verbose = 0; UnityFixture.Silent = 0; UnityFixture.GroupFilter = 0; UnityFixture.NameFilter = 0; UnityFixture.RepeatCount = 1; if (argc == 1) return 0; for (i = 1; i < argc; ) { if (strcmp(argv[i], "-v") == 0) { UnityFixture.Verbose = 1; i++; } else if (strcmp(argv[i], "-s") == 0) { UnityFixture.Silent = 1; i++; } else if (strcmp(argv[i], "-g") == 0) { i++; if (i >= argc) return 1; UnityFixture.GroupFilter = argv[i]; i++; } else if (strcmp(argv[i], "-n") == 0) { i++; if (i >= argc) return 1; UnityFixture.NameFilter = argv[i]; i++; } else if (strcmp(argv[i], "-r") == 0) { UnityFixture.RepeatCount = 2; i++; if (i < argc) { if (*(argv[i]) >= '0' && *(argv[i]) <= '9') { unsigned int digit = 0; UnityFixture.RepeatCount = 0; while (argv[i][digit] >= '0' && argv[i][digit] <= '9') { UnityFixture.RepeatCount *= 10; UnityFixture.RepeatCount += (unsigned int)argv[i][digit++] - '0'; } i++; } } } else { /* ignore unknown parameter */ i++; } } return 0; } void UnityConcludeFixtureTest(void) { if (Unity.CurrentTestIgnored) { Unity.TestIgnores++; UNITY_PRINT_EOL(); } else if (!Unity.CurrentTestFailed) { if (UnityFixture.Verbose) { UnityPrint(" "); UnityPrint(UnityStrPass); UNITY_EXEC_TIME_STOP(); UNITY_PRINT_EXEC_TIME(); UNITY_PRINT_EOL(); } } else /* Unity.CurrentTestFailed */ { Unity.TestFailures++; UNITY_PRINT_EOL(); } Unity.CurrentTestFailed = 0; Unity.CurrentTestIgnored = 0; }