Loading ci_cd/.gitlab-ci.yml +3 −1 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ stages: - lab1 - lab2 - lab3 - lab4 - tests include: Loading @@ -12,3 +13,4 @@ include: - local: 'ci_cd/lab1.yml' # Lab 1 - local: 'ci_cd/lab2.yml' # Lab 2 - local: 'ci_cd/lab3.yml' # Lab 3 - local: 'ci_cd/lab4.yml' # Lab 4 No newline at end of file ci_cd/lab4.yml 0 → 100644 +98 −0 Original line number Diff line number Diff line ### Lab 4 prebuild_lab_4: stage: lab4 script: - echo "Changes Detected (if any):"; - git diff --name-only $CI_COMMIT_SHA~ $CI_COMMIT_SHA || echo "No changes found"; - FILES_ADDED=$(git diff --name-only --diff-filter=A HEAD~1 | wc -l) - | # Check if lab4.cpp exists if [ ! -f "lab4.cpp" ]; then echo "lab4.cpp does not exist"; exit 1; fi # Check that only one file was checked in if [ "FILES_ADDED" -ne 1 ]; then echo "Error: Only one file should be committed."; exit 1; fi # Check if lab3.cpp has been merged into master if git ls-tree -r origin/master --name-only | grep -q 'lab3.cpp'; then echo "Lab 3 complete"; else echo "Please have lab 3 merged first"; exit 1; fi - git clone https://agile.bu.edu/gitlab/configs/ec327/lab-configs/current.git base_4 artifacts: paths: - base_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [c++-17] prebuild_lab_4_SKIP: stage: lab4 script: - echo "SKIPPING Lab 4 checks because the branch name is not 'lab4'" rules: - if: '$CI_COMMIT_REF_NAME != "lab4"' tags: [c++-17] compile_lab_4: stage: lab4 script: - echo "Compiling lab4.cpp" - g++ -c lab4.cpp artifacts: paths: - base_4 dependencies: - prebuild_lab_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [c++-17] lint_lab_4: stage: lab4 script: - echo "Static code check of lab4.cpp" - cppcheck --check-config --enable=all --inconclusive --error-exitcode=1 lab4.cpp tests/LabFour.cpp allow_failure: false artifacts: paths: - base_4 dependencies: - prebuild_lab_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [cppcheck] test_lab_4: stage: lab4 script: - echo "Testing Lab 4"; - git clone https://agile.bu.edu/gitlab/configs/ec327/lab-configs/current.git base_4 - cp lab4.cpp base_4/tests - cd base_4/tests - make lab4 dependencies: - compile_lab_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [c++-17] # trigger internal tests only upon a merge request into master internal_tests_lab_4: stage: tests script: - git clone https://trachten-gitlab:$INTERNAL_LAB_TESTS@agile.bu.edu/gitlab/ec327/ec327-staff/lab-tests.git - cp -f lab4.cpp lab-tests/internal_tests/ - cd lab-tests/internal_tests - make lab4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4" && $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"' tags: [ c++-17 ] problems/LabFour_ChapterEleven.h +1 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,7 @@ int labFour_pTwo_exchange(int dollars); * 4 | 9 = 6+3 * * @example 3 * labFour_pThree_genFib({0.25 ,0.25 ,5, 0.5},n) produces: * labFour_pThree_genFib({0.25 ,0.25 ,0.5, 0.5},n) produces: * n | labFour_pThree_genFib({0.25 ,0.25 ,0.5, 0.5},n) * -4 | 1 // hard-coded * -3 | 1 // hard-coded Loading problems/LabFour_ChapterTen.h +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ using namespace std; * labFour_pZero_Person Jim("James"); * Jim.setBirthday("2010-02-28"); // Jim's birthday is on February 28, 2010 * labFour_pZero_Student Jane("Jane","2020-03-15"); * Jane.setMajor(COMPUTER_ENGINEERING); * Jane.setMajor("COMPUTER_ENGINEERING"); * labFour_pZero_Instructor Gabi("Gabriella"); * Gabi.setBirthday("2000-01-03"); * Gabi.setSalary(100000); // $100,000 per year Loading tests/LabFour.cpp 0 → 100644 +239 −0 Original line number Diff line number Diff line /** ** Created by James Knee on 11/17/2024 ** With help from ChatGPT */ #include <iostream> #include <string> #include <cstring> #include <cmath> #include "Support/Common.h" #include "lab4.cpp" using namespace std; bool test_labFour_pZero(){ labFour_pZero_Person person1("James"); person1.setBirthday("2010-02-28"); labFour_pZero_Student person2("Jane","2020-03-15"); person2.setMajor("COMPUTER_ENGINEERING"); labFour_pZero_Instructor person3("Gabi"); person3.setBirthday("2000-01-03"); person3.setSalary(100000); labFour_pZero_Person person4(); labFour_pZero_Student person5(); labFour_pZero_Instructor person6(); person4 >> "Pleiade" >> "2004-02-26"; person5 >> "Jake" >> "2000-11-22" >> "Computer Science"; person6 >> "Olivia" >> "2000-01-30" >> 123456; Common::redirIO(); cout << person4; string output0 = Common::restoreIO(); Common::redirIO(); cout << person5; string output1 = Common::restoreIO(); Common::redirIO(); cout << person6; string output2 = Common::restoreIO(); if(person1.getName() != "James"){ cout << "Test 0a failed" << endl; return false; } if(person1.getBirthday() != "2010-02-28"){ cout << "Test 0b failed" << endl; return false; } if(person2.getName() != "Jane"){ cout << "Test 0c failed" << endl; return false; } if(person2.getBirthday() != "2020-03-15"){ cout << "Test 0d failed" << endl; return false; } if(person2.getMajor() != "COMPUTER_ENGINEERING"){ cout << "Test 0e failed" << endl; return false; } if(person3.getName() != "Gabi"){ cout << "Test 0f failed" << endl; return false; } if(person3.getBirthday() != "2000-01-03"){ cout << "Test 0g failed" << endl; return false; } if(person3.getSalary() != 100000){ cout << "Test 0h failed" << endl; return false; } //Quick test of the << operators for each class //Since we don't have a specific way to format the output, we have to check it is included if(output0.find("Pleiade")==string::npos || output0.find("2004-02-26")==string::npos){ cout << "Test 0i failed" << endl; return false; } if(output1.find("Jake")==string::npos || output1.find("2000-11-22")==string::npos || output1.find("Computer Science")==string::npos){ cout << "Test 0j failed" << endl; return false; } if(output2.find("Olivia")==string::npos || output2.find("2000-01-30")==string::npos || output2.find("123456")==string::npos){ cout << "Test 0k failed" << endl; return false; } // All tests passed return true; } bool test_labFour_pOne(){ labFour_pOne_Quadrilateral q1( {1, 1}, {1, 2}, {2, 2}, {2, 1}); // area 1, perimeter 4 labFour_pOne_Rectangle re1({0, 0}, 1, 2); // area 2, perimeter 6 labFour_pOne_Square s1({1, 3}, 3); //area 9, perimeter 12 labFour_pOne_Rhombus rh1({1, 1}, 1, 45); // area sqrt(2)/2, perimeter 4 labFour_pOne_Circle c1({0, 0}, 1); // area pi, perimeter 2*pi vector<labFour_pOne_GeometricThing *> things = {&re1, &s1, &rh1, &c1}; if(q1.getArea() != 1){ cout << "Test 1a failed" << endl; return false; } if(q1.getPerimeter() != 4){ cout << "Test 1b failed" << endl; return false; } if(re1.getArea() != 2){ cout << "Test 1c failed" << endl; return false; } if(re1.getPerimeter() != 6){ cout << "Test 1d failed" << endl; return false; } if(s1.getArea() != 9){ cout << "Test 1e failed" << endl; return false; } if(s1.getPerimeter() != 12){ cout << "Test 1f failed" << endl; return false; } if(rh1.getArea() != sqrt(2) / 2){ cout << "Test 1g failed" << endl; return false; } if(rh1.getPerimeter() != 4){ cout << "Test 1h failed" << endl; return false; } if(c1.getArea() != M_PI){ cout << "Test 1i failed" << endl; return false; } if(c1.getPerimeter() != 2 * M_PI){ cout << "Test 1j failed" << endl; return false; } if(labFour_pOne_GeometricThing::sumAreas(things) != 1 + 2 + 9 + sqrt(2) / 2 + M_PI){ cout << "Test 1k failed" << endl; return false; } if(labFour_pOne_GeometricThing::sumPerimeters(things) != 4 + 6 + 12 + 4 + 2 * M_PI){ cout << "Test 1l failed" << endl; return false; } // All tests passed return true; } bool test_labFour_pTwo(){ if(labFour_pTwo_exchange(8) != 6){ cout << "Test 2a failed" << endl; return false; } // All tests passed return true; } bool test_labFour_pThree(){ if(labFour_pThree_genFib({1,1}, 3) != 8){ cout << "Test 3a failed" << endl; return false; } if(labFour_pThree_genFib({1,0,1}, 4) != 9){ cout << "Test 3b failed" << endl; return false; } if(labFour_pThree_genFib({0.25 ,0.25 ,0.5, 0.5}, 3) != 2.5625){ cout << "Test 3c failed" << endl; return false; } // All tests passed return true; } int main() { bool t0 = test_labFour_pZero(); bool t1 = test_labFour_pOne(); bool t2 = test_labFour_pTwo(); bool t3 = test_labFour_pThree(); cout << "pZero: " << (t0 ? "passed" : "failed") << endl; cout << "pOne: " << (t1 ? "passed" : "failed") << endl; cout << "pTwo: " << (t2 ? "passed" : "failed") << endl; cout << "pThree: " << (t3 ? "passed" : "failed") << endl; if (t0 && t1 && t2 && t3) { // all tests passed exit(0); // passed } else { exit(-1); // failed } } No newline at end of file Loading
ci_cd/.gitlab-ci.yml +3 −1 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ stages: - lab1 - lab2 - lab3 - lab4 - tests include: Loading @@ -12,3 +13,4 @@ include: - local: 'ci_cd/lab1.yml' # Lab 1 - local: 'ci_cd/lab2.yml' # Lab 2 - local: 'ci_cd/lab3.yml' # Lab 3 - local: 'ci_cd/lab4.yml' # Lab 4 No newline at end of file
ci_cd/lab4.yml 0 → 100644 +98 −0 Original line number Diff line number Diff line ### Lab 4 prebuild_lab_4: stage: lab4 script: - echo "Changes Detected (if any):"; - git diff --name-only $CI_COMMIT_SHA~ $CI_COMMIT_SHA || echo "No changes found"; - FILES_ADDED=$(git diff --name-only --diff-filter=A HEAD~1 | wc -l) - | # Check if lab4.cpp exists if [ ! -f "lab4.cpp" ]; then echo "lab4.cpp does not exist"; exit 1; fi # Check that only one file was checked in if [ "FILES_ADDED" -ne 1 ]; then echo "Error: Only one file should be committed."; exit 1; fi # Check if lab3.cpp has been merged into master if git ls-tree -r origin/master --name-only | grep -q 'lab3.cpp'; then echo "Lab 3 complete"; else echo "Please have lab 3 merged first"; exit 1; fi - git clone https://agile.bu.edu/gitlab/configs/ec327/lab-configs/current.git base_4 artifacts: paths: - base_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [c++-17] prebuild_lab_4_SKIP: stage: lab4 script: - echo "SKIPPING Lab 4 checks because the branch name is not 'lab4'" rules: - if: '$CI_COMMIT_REF_NAME != "lab4"' tags: [c++-17] compile_lab_4: stage: lab4 script: - echo "Compiling lab4.cpp" - g++ -c lab4.cpp artifacts: paths: - base_4 dependencies: - prebuild_lab_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [c++-17] lint_lab_4: stage: lab4 script: - echo "Static code check of lab4.cpp" - cppcheck --check-config --enable=all --inconclusive --error-exitcode=1 lab4.cpp tests/LabFour.cpp allow_failure: false artifacts: paths: - base_4 dependencies: - prebuild_lab_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [cppcheck] test_lab_4: stage: lab4 script: - echo "Testing Lab 4"; - git clone https://agile.bu.edu/gitlab/configs/ec327/lab-configs/current.git base_4 - cp lab4.cpp base_4/tests - cd base_4/tests - make lab4 dependencies: - compile_lab_4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4"' tags: [c++-17] # trigger internal tests only upon a merge request into master internal_tests_lab_4: stage: tests script: - git clone https://trachten-gitlab:$INTERNAL_LAB_TESTS@agile.bu.edu/gitlab/ec327/ec327-staff/lab-tests.git - cp -f lab4.cpp lab-tests/internal_tests/ - cd lab-tests/internal_tests - make lab4 rules: - if: '$CI_COMMIT_REF_NAME == "lab4" && $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"' tags: [ c++-17 ]
problems/LabFour_ChapterEleven.h +1 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,7 @@ int labFour_pTwo_exchange(int dollars); * 4 | 9 = 6+3 * * @example 3 * labFour_pThree_genFib({0.25 ,0.25 ,5, 0.5},n) produces: * labFour_pThree_genFib({0.25 ,0.25 ,0.5, 0.5},n) produces: * n | labFour_pThree_genFib({0.25 ,0.25 ,0.5, 0.5},n) * -4 | 1 // hard-coded * -3 | 1 // hard-coded Loading
problems/LabFour_ChapterTen.h +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ using namespace std; * labFour_pZero_Person Jim("James"); * Jim.setBirthday("2010-02-28"); // Jim's birthday is on February 28, 2010 * labFour_pZero_Student Jane("Jane","2020-03-15"); * Jane.setMajor(COMPUTER_ENGINEERING); * Jane.setMajor("COMPUTER_ENGINEERING"); * labFour_pZero_Instructor Gabi("Gabriella"); * Gabi.setBirthday("2000-01-03"); * Gabi.setSalary(100000); // $100,000 per year Loading
tests/LabFour.cpp 0 → 100644 +239 −0 Original line number Diff line number Diff line /** ** Created by James Knee on 11/17/2024 ** With help from ChatGPT */ #include <iostream> #include <string> #include <cstring> #include <cmath> #include "Support/Common.h" #include "lab4.cpp" using namespace std; bool test_labFour_pZero(){ labFour_pZero_Person person1("James"); person1.setBirthday("2010-02-28"); labFour_pZero_Student person2("Jane","2020-03-15"); person2.setMajor("COMPUTER_ENGINEERING"); labFour_pZero_Instructor person3("Gabi"); person3.setBirthday("2000-01-03"); person3.setSalary(100000); labFour_pZero_Person person4(); labFour_pZero_Student person5(); labFour_pZero_Instructor person6(); person4 >> "Pleiade" >> "2004-02-26"; person5 >> "Jake" >> "2000-11-22" >> "Computer Science"; person6 >> "Olivia" >> "2000-01-30" >> 123456; Common::redirIO(); cout << person4; string output0 = Common::restoreIO(); Common::redirIO(); cout << person5; string output1 = Common::restoreIO(); Common::redirIO(); cout << person6; string output2 = Common::restoreIO(); if(person1.getName() != "James"){ cout << "Test 0a failed" << endl; return false; } if(person1.getBirthday() != "2010-02-28"){ cout << "Test 0b failed" << endl; return false; } if(person2.getName() != "Jane"){ cout << "Test 0c failed" << endl; return false; } if(person2.getBirthday() != "2020-03-15"){ cout << "Test 0d failed" << endl; return false; } if(person2.getMajor() != "COMPUTER_ENGINEERING"){ cout << "Test 0e failed" << endl; return false; } if(person3.getName() != "Gabi"){ cout << "Test 0f failed" << endl; return false; } if(person3.getBirthday() != "2000-01-03"){ cout << "Test 0g failed" << endl; return false; } if(person3.getSalary() != 100000){ cout << "Test 0h failed" << endl; return false; } //Quick test of the << operators for each class //Since we don't have a specific way to format the output, we have to check it is included if(output0.find("Pleiade")==string::npos || output0.find("2004-02-26")==string::npos){ cout << "Test 0i failed" << endl; return false; } if(output1.find("Jake")==string::npos || output1.find("2000-11-22")==string::npos || output1.find("Computer Science")==string::npos){ cout << "Test 0j failed" << endl; return false; } if(output2.find("Olivia")==string::npos || output2.find("2000-01-30")==string::npos || output2.find("123456")==string::npos){ cout << "Test 0k failed" << endl; return false; } // All tests passed return true; } bool test_labFour_pOne(){ labFour_pOne_Quadrilateral q1( {1, 1}, {1, 2}, {2, 2}, {2, 1}); // area 1, perimeter 4 labFour_pOne_Rectangle re1({0, 0}, 1, 2); // area 2, perimeter 6 labFour_pOne_Square s1({1, 3}, 3); //area 9, perimeter 12 labFour_pOne_Rhombus rh1({1, 1}, 1, 45); // area sqrt(2)/2, perimeter 4 labFour_pOne_Circle c1({0, 0}, 1); // area pi, perimeter 2*pi vector<labFour_pOne_GeometricThing *> things = {&re1, &s1, &rh1, &c1}; if(q1.getArea() != 1){ cout << "Test 1a failed" << endl; return false; } if(q1.getPerimeter() != 4){ cout << "Test 1b failed" << endl; return false; } if(re1.getArea() != 2){ cout << "Test 1c failed" << endl; return false; } if(re1.getPerimeter() != 6){ cout << "Test 1d failed" << endl; return false; } if(s1.getArea() != 9){ cout << "Test 1e failed" << endl; return false; } if(s1.getPerimeter() != 12){ cout << "Test 1f failed" << endl; return false; } if(rh1.getArea() != sqrt(2) / 2){ cout << "Test 1g failed" << endl; return false; } if(rh1.getPerimeter() != 4){ cout << "Test 1h failed" << endl; return false; } if(c1.getArea() != M_PI){ cout << "Test 1i failed" << endl; return false; } if(c1.getPerimeter() != 2 * M_PI){ cout << "Test 1j failed" << endl; return false; } if(labFour_pOne_GeometricThing::sumAreas(things) != 1 + 2 + 9 + sqrt(2) / 2 + M_PI){ cout << "Test 1k failed" << endl; return false; } if(labFour_pOne_GeometricThing::sumPerimeters(things) != 4 + 6 + 12 + 4 + 2 * M_PI){ cout << "Test 1l failed" << endl; return false; } // All tests passed return true; } bool test_labFour_pTwo(){ if(labFour_pTwo_exchange(8) != 6){ cout << "Test 2a failed" << endl; return false; } // All tests passed return true; } bool test_labFour_pThree(){ if(labFour_pThree_genFib({1,1}, 3) != 8){ cout << "Test 3a failed" << endl; return false; } if(labFour_pThree_genFib({1,0,1}, 4) != 9){ cout << "Test 3b failed" << endl; return false; } if(labFour_pThree_genFib({0.25 ,0.25 ,0.5, 0.5}, 3) != 2.5625){ cout << "Test 3c failed" << endl; return false; } // All tests passed return true; } int main() { bool t0 = test_labFour_pZero(); bool t1 = test_labFour_pOne(); bool t2 = test_labFour_pTwo(); bool t3 = test_labFour_pThree(); cout << "pZero: " << (t0 ? "passed" : "failed") << endl; cout << "pOne: " << (t1 ? "passed" : "failed") << endl; cout << "pTwo: " << (t2 ? "passed" : "failed") << endl; cout << "pThree: " << (t3 ? "passed" : "failed") << endl; if (t0 && t1 && t2 && t3) { // all tests passed exit(0); // passed } else { exit(-1); // failed } } No newline at end of file