Browse Source

Implement basic send money functionality

remotes/origin/feature/loan-eligibility
fdlt3817 2 years ago
parent
commit
c13afaf610
  1. 3
      build/test/cache/defines_dependency.yml
  2. 242
      build/test/cache/input.yml
  3. 155
      build/test/cache/test_sendmoney.c
  4. 6
      build/test/dependencies/cmock.d
  5. 1
      build/test/dependencies/sendmoney.d
  6. 3
      build/test/dependencies/test_sendmoney.d
  7. 4
      build/test/dependencies/test_sendmoney_runner.d
  8. 4
      build/test/dependencies/unity.d
  9. BIN
      build/test/out/c/cmock.o
  10. BIN
      build/test/out/c/sendmoney.o
  11. BIN
      build/test/out/c/test_sendmoney.o
  12. BIN
      build/test/out/c/test_sendmoney_runner.o
  13. BIN
      build/test/out/c/unity.o
  14. BIN
      build/test/out/test_sendmoney.out
  15. 155
      build/test/preprocess/files/test_sendmoney.c
  16. 3
      build/test/preprocess/includes/test_sendmoney.c
  17. 27
      build/test/results/test_sendmoney.fail
  18. 85
      build/test/runners/test_sendmoney_runner.c
  19. 4
      src/CustomerData.txt
  20. BIN
      src/a.exe
  21. 158
      src/sendmoney.c
  22. BIN
      src/sendmoney.exe
  23. 8
      src/sendmoney.h
  24. 45
      src/updateCustomerAccountBalance.c
  25. 2
      src/updateCustomerAccountBalance.h
  26. 0
      test/support/.gitkeep
  27. 0
      tests/test_sendmoney.c

3
build/test/cache/defines_dependency.yml

@ -1,3 +0,0 @@
---
src/sendmoney.c:
- TEST

242
build/test/cache/input.yml

@ -1,242 +0,0 @@
---
:project:
:use_exceptions: false
:use_mocks: true
:compile_threads: 1
:test_threads: 1
:use_test_preprocessor: true
:use_preprocessor_directives: false
:use_deep_dependencies: false
:generate_deep_dependencies: true
:auto_link_deep_dependencies: false
:test_file_prefix: test_
:options_paths: []
:release_build: false
:use_auxiliary_dependencies: true
:build_root: build
:which_ceedling: gem
:ceedling_version: 0.31.1
:default_tasks:
- test:all
:release_build:
:use_assembly: false
:artifacts: []
:paths:
:test:
- "+:test/**"
- "-:test/support"
:source:
- src/**
:support:
- test/support
:include: []
:libraries: []
:test_toolchain_include: []
:release_toolchain_include: []
:files:
:test: []
:source: []
:assembly: []
:support: []
:include: []
:environment:
- :rake_columns: '120'
:defines:
:test:
- &1 []
- TEST
:test_preprocess:
- *1
- TEST
:release: []
:release_preprocess: []
:use_test_definition: false
:common: []
:libraries:
:flag: "-l${1}"
:path_flag: "-L ${1}"
:test: []
:test_preprocess: []
:release: []
:release_preprocess: []
:placement: :end
:system: []
:flags: {}
:extension:
:header: ".h"
:source: ".c"
:assembly: ".s"
:object: ".o"
:libraries:
- ".a"
- ".so"
:executable: ".out"
:map: ".map"
:list: ".lst"
:testpass: ".pass"
:testfail: ".fail"
:dependencies: ".d"
:unity:
:vendor_path: C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor
:defines: []
:cmock:
:vendor_path: C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor
:defines: []
:includes: []
: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
:mock_path: build/test/mocks
:verbosity: 3
:unity_helper: false
:cexception:
:vendor_path: C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor
:defines: []
:test_runner:
:includes: []
:file_suffix: _runner
:tools:
:test_compiler:
:executable: gcc.exe
:name: default_test_compiler
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-DGNU_COMPILER"
- "-g"
- ''
- -c "${1}"
- -o "${2}"
- "-MMD"
- -MF "${4}"
:test_fixture:
:executable: "${1}"
:name: default_test_fixture
:stderr_redirect: :auto
:background_exec: :none
:optional: false
:arguments: []
:test_linker:
:executable: gcc.exe
:name: default_test_linker
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- ''
- '"${1}"'
- "${5}"
- -o "${2}"
- ''
- "${4}"
- ''
:test_file_preprocessor:
:executable: gcc.exe
:name: default_test_file_preprocessor
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- "-E"
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-D$": DEFINES_TEST_PREPROCESS
- "-DGNU_COMPILER"
- '"${1}"'
- -o "${2}"
:test_file_preprocessor_directives:
:executable: gcc.exe
:name: default_test_file_preprocessor_directives
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- "-E"
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-D$": DEFINES_TEST_PREPROCESS
- "-DGNU_COMPILER"
- "-fdirectives-only"
- '"${1}"'
- -o "${2}"
:test_includes_preprocessor:
:executable: gcc.exe
:name: default_test_includes_preprocessor
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- "-E"
- "-MM"
- "-MG"
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-D$": DEFINES_TEST_PREPROCESS
- "-DGNU_COMPILER"
- '"${1}"'
:test_compiler:
:arguments: []
:test_linker:
:arguments: []
:test_fixture:
:arguments: []
:link_objects: []
:test_includes_preprocessor:
:arguments: []
:test_file_preprocessor:
:arguments: []
:test_file_preprocessor_directives:
:arguments: []
:test_dependencies_generator:
:arguments: []
:release_compiler:
:arguments: []
:release_linker:
:arguments: []
:release_assembler:
:arguments: []
:release_dependencies_generator:
:arguments: []
:plugins:
:load_paths:
- C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/lib/../plugins
:enabled:
- stdout_pretty_tests_report
- module_generator
:display_raw_test_results: false
:stdout_pretty_tests_report_path: C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/lib/../plugins/stdout_pretty_tests_report
:module_generator_path: C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/lib/../plugins/module_generator
:gcov:
:reports:
- HtmlDetailed
:gcovr:
:html_medium_threshold: 75
:html_high_threshold: 90
:module_generator:
:project_root: "./"
:source_root: src/
:test_root: test/

155
build/test/cache/test_sendmoney.c

@ -1,155 +0,0 @@
#include "C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h"
#include "src/sendmoney.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_sendmoney_NeedToImplement(void)
{
int accountNumber = 1234567;
int accountNumber2 = 5555557;
int accountNumber3 = 53323;
int accountNumber4 = 34342;
_Bool
expected;
_Bool
expected2;
_Bool
expected3;
_Bool
expected4;
expected = checkAccount(accountNumber);
expected2 = checkAccount(accountNumber2);
expected3 = checkAccount(accountNumber3);
expected4 = checkAccount(accountNumber4);
do {if ((expected)) {} else {UnityFail( ((" Expected TRUE Was FALSE")), (UNITY_UINT)((UNITY_UINT)(36)));}} while(0);
do {if ((expected2)) {} else {UnityFail( ((" Expected TRUE Was FALSE")), (UNITY_UINT)((UNITY_UINT)(37)));}} while(0);
do {if (!(expected3)) {} else {UnityFail( ((" Expected FALSE Was TRUE")), (UNITY_UINT)((UNITY_UINT)(38)));}} while(0);
do {if (!(expected4)) {} else {UnityFail( ((" Expected FALSE Was TRUE")), (UNITY_UINT)((UNITY_UINT)(39)));}} while(0);
}
void test_getAvailableAccountBalance(void)
{
double expected1 = 24.0;
int length = 2;
double result = getAvailableAccountBalance(length);
UnityAssertEqualNumber((UNITY_INT)((expected1)), (UNITY_INT)((result)), (
((void *)0)
), (UNITY_UINT)(56), UNITY_DISPLAY_STYLE_INT);
}
void test_getAmount(void)
{
float expected = 500.1;
float result = getAmount(expected);
UnityAssertEqualNumber((UNITY_INT)((expected)), (UNITY_INT)((result)), (
((void *)0)
), (UNITY_UINT)(66), UNITY_DISPLAY_STYLE_INT);
}

6
build/test/dependencies/cmock.d

@ -1,6 +0,0 @@
build/test/out/c/cmock.o: \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/cmock/src/cmock.c \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/cmock/src/cmock.h \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/cmock/src/cmock_internals.h \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h

1
build/test/dependencies/sendmoney.d

@ -1 +0,0 @@
build/test/out/c/sendmoney.o: src/sendmoney.c src/sendmoney.h

3
build/test/dependencies/test_sendmoney.d

@ -1,3 +0,0 @@
build/test/out/c/test_sendmoney.o: test/test_sendmoney.c src/sendmoney.h \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h

4
build/test/dependencies/test_sendmoney_runner.d

@ -1,4 +0,0 @@
build/test/out/c/test_sendmoney_runner.o: \
build/test/runners/test_sendmoney_runner.c \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h

4
build/test/dependencies/unity.d

@ -1,4 +0,0 @@
build/test/out/c/unity.o: \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.c \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h

BIN
build/test/out/c/cmock.o

BIN
build/test/out/c/sendmoney.o

BIN
build/test/out/c/test_sendmoney.o

BIN
build/test/out/c/test_sendmoney_runner.o

BIN
build/test/out/c/unity.o

BIN
build/test/out/test_sendmoney.out

155
build/test/preprocess/files/test_sendmoney.c

@ -1,155 +0,0 @@
#include "C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h"
#include "src/sendmoney.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_sendmoney_NeedToImplement(void)
{
int accountNumber = 1234567;
int accountNumber2 = 5555557;
int accountNumber3 = 53323;
int accountNumber4 = 34342;
_Bool
expected;
_Bool
expected2;
_Bool
expected3;
_Bool
expected4;
expected = checkAccount(accountNumber);
expected2 = checkAccount(accountNumber2);
expected3 = checkAccount(accountNumber3);
expected4 = checkAccount(accountNumber4);
do {if ((expected)) {} else {UnityFail( ((" Expected TRUE Was FALSE")), (UNITY_UINT)((UNITY_UINT)(36)));}} while(0);
do {if ((expected2)) {} else {UnityFail( ((" Expected TRUE Was FALSE")), (UNITY_UINT)((UNITY_UINT)(37)));}} while(0);
do {if (!(expected3)) {} else {UnityFail( ((" Expected FALSE Was TRUE")), (UNITY_UINT)((UNITY_UINT)(38)));}} while(0);
do {if (!(expected4)) {} else {UnityFail( ((" Expected FALSE Was TRUE")), (UNITY_UINT)((UNITY_UINT)(39)));}} while(0);
}
void test_getAvailableAccountBalance(void)
{
double expected1 = 24.0;
int length = 2;
double result = getAvailableAccountBalance(length);
UnityAssertEqualNumber((UNITY_INT)((expected1)), (UNITY_INT)((result)), (
((void *)0)
), (UNITY_UINT)(56), UNITY_DISPLAY_STYLE_INT);
}
void test_getAmount(void)
{
float expected = 500.1;
float result = getAmount(expected);
UnityAssertEqualNumber((UNITY_INT)((expected)), (UNITY_INT)((result)), (
((void *)0)
), (UNITY_UINT)(66), UNITY_DISPLAY_STYLE_INT);
}

3
build/test/preprocess/includes/test_sendmoney.c

@ -1,3 +0,0 @@
---
- src/sendmoney.h
- C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h

27
build/test/results/test_sendmoney.fail

@ -1,27 +0,0 @@
---
:source:
:path: test
:file: test_sendmoney.c
:successes:
- :test: test_sendmoney_NeedToImplement
:line: 13
:message: ''
:unity_test_time: 0
- :test: test_getAmount
:line: 59
:message: ''
:unity_test_time: 0
:failures:
- :test: test_getAvailableAccountBalance
:line: 56
:message: Expected 24 Was 0
:unity_test_time: 0
:ignores: []
:counts:
:total: 3
:passed: 2
:failed: 1
:ignored: 0
:stdout:
- 'Error: customer data file cannot be opened!'
:time: 0.04625630000009551

85
build/test/runners/test_sendmoney_runner.c

@ -1,85 +0,0 @@
/* AUTOGENERATED FILE. DO NOT EDIT. */
/*=======Automagically Detected Files To Include=====*/
#include "unity.h"
int GlobalExpectCount;
int GlobalVerifyOrder;
char* GlobalOrderError;
/*=======External Functions This Runner Calls=====*/
extern void setUp(void);
extern void tearDown(void);
extern void test_sendmoney_NeedToImplement(void);
extern void test_getAvailableAccountBalance(void);
extern void test_getAmount(void);
/*=======Mock Management=====*/
static void CMock_Init(void)
{
GlobalExpectCount = 0;
GlobalVerifyOrder = 0;
GlobalOrderError = NULL;
}
static void CMock_Verify(void)
{
}
static void CMock_Destroy(void)
{
}
/*=======Test Reset Options=====*/
void resetTest(void);
void resetTest(void)
{
tearDown();
CMock_Verify();
CMock_Destroy();
CMock_Init();
setUp();
}
void verifyTest(void);
void verifyTest(void)
{
CMock_Verify();
}
/*=======Test Runner Used To Run Each Test=====*/
static void run_test(UnityTestFunction func, const char* name, UNITY_LINE_TYPE line_num)
{
Unity.CurrentTestName = name;
Unity.CurrentTestLineNumber = line_num;
#ifdef UNITY_USE_COMMAND_LINE_ARGS
if (!UnityTestMatches())
return;
#endif
Unity.NumberOfTests++;
UNITY_CLR_DETAILS();
UNITY_EXEC_TIME_START();
CMock_Init();
if (TEST_PROTECT())
{
setUp();
func();
}
if (TEST_PROTECT())
{
tearDown();
CMock_Verify();
}
CMock_Destroy();
UNITY_EXEC_TIME_STOP();
UnityConcludeTest();
}
/*=======MAIN=====*/
int main(void)
{
UnityBegin("test_sendmoney.c");
run_test(test_sendmoney_NeedToImplement, "test_sendmoney_NeedToImplement", 13);
run_test(test_getAvailableAccountBalance, "test_getAvailableAccountBalance", 43);
run_test(test_getAmount, "test_getAmount", 59);
return UnityEnd();
}

4
src/CustomerData.txt

@ -3,14 +3,14 @@ ID=1234
forename=Max forename=Max
Surname=Mustermann Surname=Mustermann
password=example password=example
balance=2390
balance=2300
1327=example 1327=example
ID=1327 ID=1327
forename=Max forename=Max
Surname=Mustermann Surname=Mustermann
password=example password=example
balance=70
balance=160
1666=example 1666=example
ID=1666 ID=1666

BIN
src/a.exe

158
src/sendmoney.c

@ -1,133 +1,35 @@
#include "sendmoney.h"
double getAvailableAccountBalance(int length)
{
double availableBalance;
FILE *fp;
fp = fopen("CustomerData.txt", "r");
if (fp == 0)
{
printf("Error: customer data file cannot be opened!\n");
return 0;
}
else
{
char line[length];
while (fgets(line, sizeof line, fp) != NULL)
{
if (sscanf(line, "balance =%lf", &availableBalance) == 1)
{
break;
#include "sendMoney.h"
#include "depositMoney.c"
#include "withdrawMoney.c"
bool sendMoney(int customerID){
float availableAccountBalance=getAvailableAccountBalance(customerID);
float amountToSend;
int recID;
printf("\nYou have %.2f€ in your account. How much would you like to send?\n",availableAccountBalance);
scanf("%f",&amountToSend);
if(amountToSend>0 && amountToSend<availableAccountBalance){
printf("\nYour input was %.2f€. Please enter the recipient id.\n");
scanf("%d",&recID);
if(recID>1000){
bool recExists=checkCustomerExists(recID);
if(recExists){
if(withdrawSpecificAmount(customerID, amountToSend)){
if(depositSpecificAmount(recID, amountToSend)){
printf("\nYou have successfuly transfered %.2f€ to [%d]",amountToSend,recID);
return true;
}
}
} }
} }
printf("your balance is : %lf\n", availableBalance);
fclose(fp);
}
return availableBalance;
}
// hier wird geprüft ob das Kontonummer gultig ist
bool checkAccount(int accountNumber)
{
// Refactoring
return (accountNumber >= 1000000 && accountNumber <= 9999999);
}
// hier wird amount zurückgegeben
double getAmount(double amountToSend)
{
return amountToSend;
}
// hier die wird die Kontonummer eingegeben und getestet
void getReceiverAccountNumber()
{
int accountNumber;
printf("Enter The account in Which you want to transfer the money:");
scanf("%d", &accountNumber);
int counter = 0;
while (checkAccount(accountNumber) == false && counter <= 2)
{
printf("Bitte geben Sie einen Gueltigen Kontonummer:\n");
scanf("%d", &accountNumber);
counter++;
}
if (checkAccount(accountNumber) == false)
{
printf("Konto ist ungultig\n");
printf("Programm wird beendet");
exit(0);
}
else
{
printf("Kontonummer ist Gueltig\n");
}else{
//error
return false;
} }
return false;
} }
// Methode send()
void SendMoney()
{
double amountToSend;
double length = 21;
int counter = 0;
printf("Bitte geben Sie the Amount:");
scanf("%lf", &amountToSend);
double amount = getAmount(amountToSend);
int receiverAccountNumber;
double availableAccountBalance = getAvailableAccountBalance(length);
char tryDifferentAmount;
if (amountToSend < 0)
{
printf("Bitte geben Sie einen Gültigen Amount");
}
else
{
if (amountToSend <= availableAccountBalance)
{
getReceiverAccountNumber();
initiateMoneyTransfer(amount);
}
else
{
printf("You don't have a sufficient money to transfer\n");
printf("try with a different amount? [y]: Yes, any Other key: exit:");
scanf("%s", &tryDifferentAmount);
if (tryDifferentAmount == 'Y' || tryDifferentAmount == 'y')
{
SendMoney();
}
else
{
printf("Programm wird beendet");
exit(0);
}
}
}
}
void initiateMoneyTransfer(float amountToSend)
{
printf("Money transferred \n");
printf("You have succesfully sent %lf\n ", amountToSend);
}
// int main(){
// sendMoney(1234);
// return 0;
// }

BIN
src/sendmoney.exe

8
src/sendmoney.h

@ -5,12 +5,6 @@
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
bool checkAccount(int accountNumber);
double getAvailableAccountBalance(int length);
double getAmount(double amountToSend);
void getReceiverAccountNumber();
void SendMoney();
void initiateMoneyTransfer(float amountToSend);
bool sendMoney(int customerID);
#endif // SENDMONEY_H #endif // SENDMONEY_H

45
src/updateCustomerAccountBalance.c

@ -112,6 +112,51 @@ bool updateAvailableAccountBalance(int user_id, float newBalance){
} }
return false; return false;
}
bool checkCustomerExists(int customerID){
bool keep_reading = true;
bool customer_found=false;
char buffer[MAX_LENGTH];
char stringID[MAX_LENGTH] = "ID=";
char user_id_as_string[MAX_LENGTH];
char balance_String[MAX_LENGTH];
int currentLine=0;
sprintf(user_id_as_string, "%d", customerID); // converts user_id to string
strcat(stringID, user_id_as_string);
FILE *file = fopen(CUSTOMER_DATA_FILE, "r+");
if (file == NULL) {
return false;
}
while(keep_reading) {
fgets(buffer, MAX_LENGTH, file);
currentLine++;
if (feof(file)) {
keep_reading = false;
}
else if(strstr(buffer, stringID)) { //found the customer
for (int i = 0; i < 4; i++) {
fgets(buffer, MAX_LENGTH, file);
}
strcpy(balance_String, buffer);
currentLine+=4;
keep_reading = false;
customer_found=true;
}
}
fclose(file);;
if(customer_found){
return true;
}else{
return false;
}
return false;
} }
//traditional testing section //traditional testing section

2
src/updateCustomerAccountBalance.h

@ -9,7 +9,7 @@
bool updateAvailableAccountBalance(int user_id, float newBalance); bool updateAvailableAccountBalance(int user_id, float newBalance);
bool checkCustomerExists(int customerID);
void replaceBalanceInString(float replacementBalance, int currentLine); void replaceBalanceInString(float replacementBalance, int currentLine);
#endif #endif

0
test/support/.gitkeep

0
test/test_sendmoney.c → tests/test_sendmoney.c

Loading…
Cancel
Save