diff --git a/CMakeLists.txt b/CMakeLists.txt index 0eddcd7..bf74cec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,13 @@ -##################################################### -# FILE NAME CMakeLists.txt # -# # -# WRITTEN BY Michael Brockus. # -# # -# PURPOSE contains CMake statements. # -# # -##################################################### +################################################################################### +# # +# NAME: CMakeLsits.txt # +# # +# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # +# WRITTEN BY: Michael Brockus. # +# # +# License: MIT # +# # +################################################################################### cmake_minimum_required(VERSION 3.13.2.0 FATAL_ERROR) @@ -58,12 +60,9 @@ install(TARGETS "unity" EXPORT "unityConfig" ARCHIVE DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_INSTALL_BINDIR}" - - INCLUDES DESTINATION "${CMAKE_INSTALL_LIBDIR}" -) + INCLUDES DESTINATION "${CMAKE_INSTALL_LIBDIR}") install(DIRECTORY src/ DESTINATION src) - install(EXPORT unityConfig DESTINATION share/unityConfig/cmake) # This makes the project importable from the build directory diff --git a/examples/example_4/meson.build b/examples/example_4/meson.build new file mode 100644 index 0000000..21d1001 --- /dev/null +++ b/examples/example_4/meson.build @@ -0,0 +1,20 @@ +################################################################################### +# # +# NAME: examples/example_4/meson.build # +# # +# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # +# WRITTEN BY: Michael Brockus. # +# # +# License: MIT # +# # +################################################################################### + + +project('example-4') + +unity_dep = dependency('unity', fallback : ['unity', 'unity_dep']) + +example_dir = include_directories('.', join_paths('.', 'src')) + +subdir('src') +subdir('test') \ No newline at end of file diff --git a/examples/example_4/readme.txt b/examples/example_4/readme.txt new file mode 100644 index 0000000..c8f45a8 --- /dev/null +++ b/examples/example_4/readme.txt @@ -0,0 +1,15 @@ +Example 4 +========= + +Close to the simplest possible example of Unity, using only basic features. +to build this example run "meson setup ". + +Meson uses the Ninja build system to actually build the code. To start the +build, simply type the following command. + +"ninja -C " + +Meson provides native support for running tests. The command to do that is simple. + +"meson test -C ". + \ No newline at end of file diff --git a/examples/example_4/src/ProductionCode.c b/examples/example_4/src/ProductionCode.c new file mode 100644 index 0000000..db128e5 --- /dev/null +++ b/examples/example_4/src/ProductionCode.c @@ -0,0 +1,24 @@ + +#include "ProductionCode.h" + +int Counter = 0; +int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; /* some obnoxious array to search that is 1-based indexing instead of 0. */ + +/* This function is supposed to search through NumbersToFind and find a particular number. + * If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since + * NumbersToFind is indexed from 1. Unfortunately it's broken + * (and should therefore be caught by our tests) */ +int FindFunction_WhichIsBroken(int NumberToFind) +{ + int i = 0; + while (i < 8) /* Notice I should have been in braces */ + i++; + if (NumbersToFind[i] == NumberToFind) /* Yikes! I'm getting run after the loop finishes instead of during it! */ + return i; + return 0; +} + +int FunctionWhichReturnsLocalVariable(void) +{ + return Counter; +} diff --git a/examples/example_4/src/ProductionCode.h b/examples/example_4/src/ProductionCode.h new file mode 100644 index 0000000..250ca0d --- /dev/null +++ b/examples/example_4/src/ProductionCode.h @@ -0,0 +1,3 @@ + +int FindFunction_WhichIsBroken(int NumberToFind); +int FunctionWhichReturnsLocalVariable(void); diff --git a/examples/example_4/src/ProductionCode2.c b/examples/example_4/src/ProductionCode2.c new file mode 100644 index 0000000..98ee7ee --- /dev/null +++ b/examples/example_4/src/ProductionCode2.c @@ -0,0 +1,11 @@ + +#include "ProductionCode2.h" + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) +{ + (void)Poor; + (void)LittleFunction; + /* Since There Are No Tests Yet, This Function Could Be Empty For All We Know. + * Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget */ + return (char*)0; +} diff --git a/examples/example_4/src/ProductionCode2.h b/examples/example_4/src/ProductionCode2.h new file mode 100644 index 0000000..34ae980 --- /dev/null +++ b/examples/example_4/src/ProductionCode2.h @@ -0,0 +1,2 @@ + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction); diff --git a/examples/example_4/src/meson.build b/examples/example_4/src/meson.build new file mode 100644 index 0000000..5f7e5da --- /dev/null +++ b/examples/example_4/src/meson.build @@ -0,0 +1,31 @@ +################################################################################### +# # +# NAME: examples/example_4/src/meson.build # +# # +# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # +# WRITTEN BY: Michael Brockus. # +# # +# License: MIT # +# # +################################################################################### + + + +a_lib = library( + 'production-code-1', + 'ProductionCode.c', + include_directories: example_dir) + +b_lib = library( + 'production-code-2', + 'ProductionCode2.c', + include_directories: example_dir) + + +a_dep = declare_dependency( + link_with: a_lib, + include_directories: example_dir) + +b_dep = declare_dependency( + link_with: b_lib, + include_directories: example_dir) \ No newline at end of file diff --git a/examples/example_4/subprojects/unity.wrap b/examples/example_4/subprojects/unity.wrap new file mode 100755 index 0000000..bc5b386 --- /dev/null +++ b/examples/example_4/subprojects/unity.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory = unity +url = https://github.com/squidfarts/Unity.git +revision = head diff --git a/examples/example_4/test/TestProductionCode.c b/examples/example_4/test/TestProductionCode.c new file mode 100644 index 0000000..526a84e --- /dev/null +++ b/examples/example_4/test/TestProductionCode.c @@ -0,0 +1,63 @@ + +#include "ProductionCode.h" +#include "unity.h" + +/* sometimes you may want to get at local data in a module. + * for example: If you plan to pass by reference, this could be useful + * however, it should often be avoided */ +extern int Counter; + +void setUp(void) +{ + /* This is run before EACH TEST */ + Counter = 0x5a5a; +} + +void tearDown(void) +{ +} + + +void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void) +{ + /* All of these should pass */ + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(2)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); +} + +void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void) +{ + /* You should see this line fail in your test summary */ + TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); + + /* Notice the rest of these didn't get a chance to run because the line above failed. + * Unit tests abort each test function on the first sign of trouble. + * Then NEXT test function runs as normal. */ + TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void) +{ + /* This should be true because setUp set this up for us before this test */ + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); + + /* This should be true because we can still change our answer */ + Counter = 0x1234; + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void) +{ + /* This should be true again because setup was rerun before this test (and after we changed it to 0x1234) */ + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void) +{ + /* Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell + * you what actually happened...which in this case was a failure to setup the initial condition. */ + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +} diff --git a/examples/example_4/test/TestProductionCode2.c b/examples/example_4/test/TestProductionCode2.c new file mode 100644 index 0000000..2578ca9 --- /dev/null +++ b/examples/example_4/test/TestProductionCode2.c @@ -0,0 +1,35 @@ + +#include "ProductionCode2.h" +#include "unity.h" + +/* These should be ignored because they are commented out in various ways: +#include "whatever.h" +#include "somethingelse.h" +*/ + +void setUp(void) +{ +} + +void tearDown(void) +{ +} + +void test_IgnoredTest(void); +void test_AnotherIgnoredTest(void); +void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void); + +void test_IgnoredTest(void) +{ + TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); +} + +void test_AnotherIgnoredTest(void) +{ + TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); +} + +void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void) +{ + TEST_IGNORE(); /* Like This */ +} diff --git a/examples/example_4/test/meson.build b/examples/example_4/test/meson.build new file mode 100644 index 0000000..d551df9 --- /dev/null +++ b/examples/example_4/test/meson.build @@ -0,0 +1,14 @@ +################################################################################### +# # +# NAME: examples/example_4/test/meson.build # +# # +# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # +# WRITTEN BY: Michael Brockus. # +# # +# License: MIT # +# # +################################################################################### + + + +subdir('test_runners') \ No newline at end of file diff --git a/examples/example_4/test/test_runners/TestProductionCode2_Runner.c b/examples/example_4/test/test_runners/TestProductionCode2_Runner.c new file mode 100644 index 0000000..cf72c21 --- /dev/null +++ b/examples/example_4/test/test_runners/TestProductionCode2_Runner.c @@ -0,0 +1,53 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT()) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include +#include +#include "ProductionCode2.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_IgnoredTest(void); +extern void test_AnotherIgnoredTest(void); +extern void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("test/TestProductionCode2.c"); + RUN_TEST(test_IgnoredTest, 18); + RUN_TEST(test_AnotherIgnoredTest, 23); + RUN_TEST(test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented, 28); + + return (UnityEnd()); +} diff --git a/examples/example_4/test/test_runners/TestProductionCode_Runner.c b/examples/example_4/test/test_runners/TestProductionCode_Runner.c new file mode 100644 index 0000000..3b49af7 --- /dev/null +++ b/examples/example_4/test/test_runners/TestProductionCode_Runner.c @@ -0,0 +1,57 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT()) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include +#include +#include "ProductionCode.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void); +extern void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void); +extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void); +extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void); +extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("test/TestProductionCode.c"); + RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode, 20); + RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken, 30); + RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue, 41); + RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain, 51); + RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed, 57); + + return (UnityEnd()); +} diff --git a/examples/example_4/test/test_runners/meson.build b/examples/example_4/test/test_runners/meson.build new file mode 100644 index 0000000..005ca67 --- /dev/null +++ b/examples/example_4/test/test_runners/meson.build @@ -0,0 +1,24 @@ +################################################################################### +# # +# NAME: examples/example_4/test/test_runners/meson.build # +# # +# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # +# WRITTEN BY: Michael Brockus. # +# # +# License: MIT # +# # +################################################################################### + + + +test_src_1 = [ + 'TestProductionCode_Runner.c', + join_paths('..' ,'TestProductionCode.c') + ] +test_src_2 = [ + 'TestProductionCode2_Runner.c', + join_paths('..' ,'TestProductionCode2.c') + ] + +test('Test production code one', executable('test-1', test_src_1, dependencies: [ a_dep, unity_dep ])) +test('Test production code two', executable('test-2', test_src_2, dependencies: [ b_dep, unity_dep ])) \ No newline at end of file diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..7b9732a --- /dev/null +++ b/meson.build @@ -0,0 +1,80 @@ +################################################################################### +# # +# NAME: meson.build # +# # +# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # +# WRITTEN BY: Michael Brockus. # +# # +# License: MIT # +# # +################################################################################### + + + +project('unity', 'c', + version : '2.4.3', + license : 'MIT', + meson_version : '>=0.50.0', + default_options : + [ + 'werror=true', + 'optimization=3', + 'warning_level=3', + 'b_sanitize=address,undefined', + 'b_lto=true', + 'b_lundef=true' + ]) +cc = meson.get_compiler('c') +args_for_langs = 'c' + +if cc.get_id() == 'clang' + add_project_arguments( + '-Wweak-vtables', + '-Wexit-time-destructors', + '-Wglobal-constructors', + '-Wmissing-noreturn', language: args_for_langs) +endif + +if cc.get_argument_syntax() == 'gcc' + add_project_arguments( + '-Wall', + '-Wextra', + '-Wunreachable-code', + '-Wmissing-declarations', + '-Wmissing-prototypes', + '-Wredundant-decls', + '-Wundef', + '-Wwrite-strings', + '-Wformat', + '-Wformat-nonliteral', + '-Wformat-security', + '-Wold-style-definition', + '-Winit-self', + '-Wmissing-include-dirs', + '-Waddress', + '-Waggregate-return', + '-Wno-multichar', + '-Wdeclaration-after-statement', + '-Wvla', + '-Wpointer-arith',language: args_for_langs) +endif + +if cc.get_id() == 'msvc' + add_project_arguments( + '/W4', + '/w44265', + '/w44061', + '/w44062', + '/wd4018', # implicit signed/unsigned conversion + '/wd4146', # unary minus on unsigned (beware INT_MIN) + '/wd4244', # lossy type conversion (e.g. double -> int) + '/wd4305', # truncating type conversion (e.g. double -> float) + mesno.get_supported_arguments(['/utf-8']), language: args_for_langs) +endif + +subdir('src') + +unity_dep = declare_dependency( + version: meson.project_version(), + link_with: unity_lib, + include_directories: unity_dir) \ No newline at end of file diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..5d8c452 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,20 @@ +################################################################################### +# # +# NAME: src/meson.build # +# # +# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams. # +# WRITTEN BY: Michael Brockus. # +# # +# License: MIT # +# # +################################################################################### + + + +unity_src = files('unity.c') + +unity_dir = include_directories('.') + +unity_lib = library(meson.project_name(), + sources: unity_src, + include_directories: unity_dir) \ No newline at end of file