From e13793bb20caeab7e29eb4b42ae21bd59d06a1e7 Mon Sep 17 00:00:00 2001 From: fdai7514 Date: Thu, 9 Feb 2023 01:08:20 +0100 Subject: [PATCH 1/4] implement function calculatorFactorial() --- project.yml | 101 +++++++++++++++++++++++++++++++ src/calculatorFactorial.c | 6 ++ src/calculatorFactorial.h | 8 +++ src/main.c | 16 ++++- tests/support/.gitkeep | 0 tests/test_calculatorFactorial.c | 20 ++++++ 6 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 project.yml create mode 100644 src/calculatorFactorial.c create mode 100644 src/calculatorFactorial.h create mode 100644 tests/support/.gitkeep create mode 100644 tests/test_calculatorFactorial.c diff --git a/project.yml b/project.yml new file mode 100644 index 0000000..640cb8f --- /dev/null +++ b/project.yml @@ -0,0 +1,101 @@ +--- + +# Notes: +# Sample project C code is not presently written to produce a release artifact. +# As such, release build options are disabled. +# This sample, therefore, only demonstrates running a collection of unit tests. + +:project: + :use_exceptions: FALSE + :use_test_preprocessor: TRUE + :use_auxiliary_dependencies: TRUE + :build_root: build +# :release_build: TRUE + :test_file_prefix: test_ + :which_ceedling: gem + :ceedling_version: 0.31.1 + :default_tasks: + - test:all + +#:test_build: +# :use_assembly: TRUE + +#:release_build: +# :output: MyApp.out +# :use_assembly: FALSE + +:environment: + +:extension: + :executable: .out + +:paths: + :test: + - +:tests/** + - -:tests/support + :source: + - src/** + :support: + - tests/support + :libraries: [] + +:defines: + # in order to add common defines: + # 1) remove the trailing [] from the :common: section + # 2) add entries to the :common: section (e.g. :test: has TEST defined) + :common: &common_defines [] + :test: + - *common_defines + - TEST + :test_preprocess: + - *common_defines + - TEST + +:cmock: + :mock_prefix: mock_ + :when_no_prototypes: :warn + :enforce_strict_ordering: TRUE + :plugins: + - :ignore + - :callback + :treat_as: + uint8: HEX8 + uint16: HEX16 + uint32: UINT32 + int8: INT8 + bool: UINT8 + +# Add -gcov to the plugins list to make sure of the gcov plugin +# You will need to have gcov and gcovr both installed to make it work. +# For more information on these options, see docs in plugins/gcov +:gcov: + :reports: + - HtmlDetailed + :gcovr: + :html_medium_threshold: 75 + :html_high_threshold: 90 + +#:tools: +# Ceedling defaults to using gcc for compiling, linking, etc. +# As [:tools] is blank, gcc will be used (so long as it's in your system path) +# See documentation to configure a given toolchain for use + +# LIBRARIES +# These libraries are automatically injected into the build process. Those specified as +# common will be used in all types of builds. Otherwise, libraries can be injected in just +# tests or releases. These options are MERGED with the options in supplemental yaml files. +:libraries: + :placement: :end + :flag: "-l${1}" + :path_flag: "-L ${1}" + :system: [] # for example, you might list 'm' to grab the math library + :test: [] + :release: [] + +:plugins: + :load_paths: + - "#{Ceedling.load_path}" + :enabled: + - stdout_pretty_tests_report + - module_generator +... diff --git a/src/calculatorFactorial.c b/src/calculatorFactorial.c new file mode 100644 index 0000000..a86dcea --- /dev/null +++ b/src/calculatorFactorial.c @@ -0,0 +1,6 @@ +#include "calculatorFactorial.h" +int calculatorFactorial(int x) +{ + if (x==0)return 1; + else return x*calculatorFactorial(x-1); +} diff --git a/src/calculatorFactorial.h b/src/calculatorFactorial.h new file mode 100644 index 0000000..d6f0383 --- /dev/null +++ b/src/calculatorFactorial.h @@ -0,0 +1,8 @@ +#ifndef CALCULATORFACTORIAL_H +#define CALCULATORFACTORIAL_H + +#include +#include +int calculatorFactorial(int x); + +#endif // CALCULATORFACTORIAL_H diff --git a/src/main.c b/src/main.c index a3a8e04..5ec1b5b 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,14 @@ -#include -int main(){ -return 0; +#include "calculatorFactorial.c" +int main() +{ + int num, result; + + printf("number: "); + scanf("%d", &num); + + result = calculatorFactorial(num); + + printf("answer: %d", result); + return 0; } + diff --git a/tests/support/.gitkeep b/tests/support/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_calculatorFactorial.c b/tests/test_calculatorFactorial.c new file mode 100644 index 0000000..e2a176a --- /dev/null +++ b/tests/test_calculatorFactorial.c @@ -0,0 +1,20 @@ +#ifdef TEST + +#include "unity.h" + +#include "calculatorFactorial.h" + +void setUp(void) +{ +} + +void tearDown(void) +{ +} + +void test_calculatorFactorial_NeedToImplement(void) +{ + TEST_IGNORE_MESSAGE("Need to Implement calculatorFactorial"); +} + +#endif // TEST From 23472c84f49ac147a99de0b754f627490b22dc6e Mon Sep 17 00:00:00 2001 From: fdai7514 Date: Thu, 9 Feb 2023 01:11:01 +0100 Subject: [PATCH 2/4] implement unittest for calculatorFactorial.c --- build-project.sh | 1 + tests/test_calculatorFactorial.c | 63 +++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/build-project.sh b/build-project.sh index 43a0588..51cf723 100755 --- a/build-project.sh +++ b/build-project.sh @@ -1,4 +1,5 @@ clear +ceedling test:all cd src/ gcc main.c -o main ./main diff --git a/tests/test_calculatorFactorial.c b/tests/test_calculatorFactorial.c index e2a176a..42af4ec 100644 --- a/tests/test_calculatorFactorial.c +++ b/tests/test_calculatorFactorial.c @@ -12,9 +12,68 @@ void tearDown(void) { } -void test_calculatorFactorial_NeedToImplement(void) +void test1_calculatorFactorial(void) { - TEST_IGNORE_MESSAGE("Need to Implement calculatorFactorial"); + int p, a, e; + p = 1; + e = 1; + a = calculatorFactorial(p); + TEST_ASSERT_EQUAL_INT(e, a); } +void test2_calculatorFactorial(void) +{ + int p, a, e; + p = 0; + e = 1; + a = calculatorFactorial(p); + TEST_ASSERT_EQUAL_INT(e, a); +} + +void test3_calculatorFactorial(void) +{ + int p, a, e; + p = 3; + e = 6; + a = calculatorFactorial(p); + TEST_ASSERT_EQUAL_INT(e, a); +} + +void test4_calculatorFactorial(void) +{ + int p, a, e; + p = 5; + e = 120; + a = calculatorFactorial(p); + TEST_ASSERT_EQUAL_INT(e, a); +} + +void test5_calculatorFactorial(void) +{ + int p, a, e; + p = 8; + e = 40320; + a = calculatorFactorial(p); + TEST_ASSERT_EQUAL_INT(e, a); +} + +void test6_calculatorFactorial(void) +{ + int p, a, e; + p = 11; + e = 39916800; + a = calculatorFactorial(p); + TEST_ASSERT_EQUAL_INT(e, a); +} + +void test7_calculatorFactorial(void) +{ + int p, a, e; + p = 10; + e = 3628800; + a = calculatorFactorial(p); + TEST_ASSERT_EQUAL_INT(e, a); +} + + #endif // TEST From 0c34fa9c5b5d972cf942fe26b8a36e58bc1de367 Mon Sep 17 00:00:00 2001 From: fdai7514 Date: Mon, 6 Feb 2023 20:53:58 +0100 Subject: [PATCH 3/4] refactoring: change variable names, format code and attach some descriptive comments in calculatorFactorial.c --- src/calculatorFactorial.c | 13 ++++++++++--- src/calculatorFactorial.h | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/calculatorFactorial.c b/src/calculatorFactorial.c index a86dcea..fb1a228 100644 --- a/src/calculatorFactorial.c +++ b/src/calculatorFactorial.c @@ -1,6 +1,13 @@ #include "calculatorFactorial.h" -int calculatorFactorial(int x) +int calculatorFactorial(int num) //implement recursion. The function calls itself so many times, till the breaking condition is fulfilled. { - if (x==0)return 1; - else return x*calculatorFactorial(x-1); + if (num == 0) //breaking condition + { + return 1; + } + else + { + return num * calculatorFactorial(num - 1); //If its not breaking condition, then multiply the number with the same function implemented on the previous number. Eventually it will reach breaking condition. + } } + diff --git a/src/calculatorFactorial.h b/src/calculatorFactorial.h index d6f0383..5dbd323 100644 --- a/src/calculatorFactorial.h +++ b/src/calculatorFactorial.h @@ -3,6 +3,6 @@ #include #include -int calculatorFactorial(int x); +int calculatorFactorial(int num); #endif // CALCULATORFACTORIAL_H From 38cfd6baf1991d6bd2bde7d5b75c0b11b8d1e03f Mon Sep 17 00:00:00 2001 From: fdai7514 Date: Mon, 6 Feb 2023 20:59:46 +0100 Subject: [PATCH 4/4] refactoring: change variable names in test_calculatorFactorial.c --- src/calculatorFactorial.c | 5 +++ tests/test_calculatorFactorial.c | 75 +++++++++++++++++--------------- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/src/calculatorFactorial.c b/src/calculatorFactorial.c index fb1a228..e95fd11 100644 --- a/src/calculatorFactorial.c +++ b/src/calculatorFactorial.c @@ -1,4 +1,9 @@ #include "calculatorFactorial.h" +// Note: +/* This Function may or may not be implemented in actual program, even if it is merged to the main branch. + If it is temporarily not included in the main Program, then this has a role in future Development of the Project */ + + int calculatorFactorial(int num) //implement recursion. The function calls itself so many times, till the breaking condition is fulfilled. { if (num == 0) //breaking condition diff --git a/tests/test_calculatorFactorial.c b/tests/test_calculatorFactorial.c index 42af4ec..624f9fe 100644 --- a/tests/test_calculatorFactorial.c +++ b/tests/test_calculatorFactorial.c @@ -4,6 +4,11 @@ #include "calculatorFactorial.h" +// Note: +/* This Function may or may not be implemented in actual program, even if it is merged to the main branch. + If it is temporarily not included in the main Program, then this has a role in future Development of the Project */ + + void setUp(void) { } @@ -14,65 +19,65 @@ void tearDown(void) void test1_calculatorFactorial(void) { - int p, a, e; - p = 1; - e = 1; - a = calculatorFactorial(p); - TEST_ASSERT_EQUAL_INT(e, a); + int num, actual, expected; //Arrange + num = 1; + expected = 1; + actual = calculatorFactorial(num); //Act + TEST_ASSERT_EQUAL_INT(expected, actual); //Assert } void test2_calculatorFactorial(void) { - int p, a, e; - p = 0; - e = 1; - a = calculatorFactorial(p); - TEST_ASSERT_EQUAL_INT(e, a); + int num, actual, expected; //Arrange + num = 0; + expected = 1; + actual = calculatorFactorial(num); //Act + TEST_ASSERT_EQUAL_INT(expected, actual); //Assert } void test3_calculatorFactorial(void) { - int p, a, e; - p = 3; - e = 6; - a = calculatorFactorial(p); - TEST_ASSERT_EQUAL_INT(e, a); + int num, actual, expected; //Arrange + num = 3; + expected = 6; + actual = calculatorFactorial(num); //Act + TEST_ASSERT_EQUAL_INT(expected, actual); //Assert } void test4_calculatorFactorial(void) { - int p, a, e; - p = 5; - e = 120; - a = calculatorFactorial(p); - TEST_ASSERT_EQUAL_INT(e, a); + int num, actual, expected; //Arrange + num = 5; + expected = 120; + actual = calculatorFactorial(num); //Act + TEST_ASSERT_EQUAL_INT(expected, actual); //Assert } void test5_calculatorFactorial(void) { - int p, a, e; - p = 8; - e = 40320; - a = calculatorFactorial(p); - TEST_ASSERT_EQUAL_INT(e, a); + int num, actual, expected; //Arrange + num = 8; + expected = 40320; + actual = calculatorFactorial(num); //Act + TEST_ASSERT_EQUAL_INT(expected, actual); //Assert } void test6_calculatorFactorial(void) { - int p, a, e; - p = 11; - e = 39916800; - a = calculatorFactorial(p); - TEST_ASSERT_EQUAL_INT(e, a); + int num, actual, expected; //Arrange + num = 11; + expected = 39916800; + actual = calculatorFactorial(num); //Act + TEST_ASSERT_EQUAL_INT(expected, actual); //Assert } void test7_calculatorFactorial(void) { - int p, a, e; - p = 10; - e = 3628800; - a = calculatorFactorial(p); - TEST_ASSERT_EQUAL_INT(e, a); + int num, actual, expected; //Arrange + num = 10; + expected = 3628800; + actual = calculatorFactorial(num); //Act + TEST_ASSERT_EQUAL_INT(expected, actual); //Assert }