} END_TEST /********************** Combine two single digit values ***********************/ START_TEST(concatinate_all_the_digits_two_single_digit_values) { RomanNumber rnFirst = newRomanNumber("I"); RomanNumber rnSecond = newRomanNumber("I"); RomanNumber concat = rnConcatinate(rnFirst, rnSecond); ck_assert_str_eq("II", to_string(concat)); } END_TEST
} END_TEST /***************** Combine a single digit to multiple digits ******************/ START_TEST(concatinate_all_the_digits_of_a_single_and_double_digit_value) { RomanNumber rnFirst = newRomanNumber("I"); RomanNumber rnSecond = newRomanNumber("VI"); RomanNumber concat = rnConcatinate(rnFirst, rnSecond); ck_assert_str_eq("IVI", to_string(concat)); } END_TEST
} END_TEST /****************** Concatenate two non-standardized numbers ******************/ START_TEST(concatinate_all_the_digits_of_two_nonstandard_values) { RomanNumber rnFirst = newRomanNumber("XVIIII"); RomanNumber rnSecond = newRomanNumber("XVIIII"); RomanNumber concat = rnConcatinate(rnFirst, rnSecond); ck_assert_str_eq("XVIIIIXVIIII", to_string(concat)); } END_TEST
} END_TEST /************* Concatenate single digit to non-standardized value *************/ START_TEST(concatinate_all_the_digits_of_a_single_and_nonstandard_value) { RomanNumber rnFirst = newRomanNumber("I"); RomanNumber rnSecond = newRomanNumber("XVIIII"); RomanNumber concat = rnConcatinate(rnFirst, rnSecond); ck_assert_str_eq("IXVIIII", to_string(concat)); } END_TEST
} END_TEST /************** Concatenate multi-digit value to a complex value **************/ START_TEST(concatinate_all_the_digits_of_two_complex_values) { RomanNumber rnFirst = newRomanNumber("MDCCCCLXXXXVIIII"); RomanNumber rnSecond = newRomanNumber("MDCCCCLXXXXVIIII"); RomanNumber concat = rnConcatinate(rnFirst, rnSecond); ck_assert_str_eq("MDCCCCLXXXXVIIIIMDCCCCLXXXXVIIII", to_string(concat)); } END_TEST
} END_TEST /******************** Test Subtract Function, start simple 10-5=5 *******************/ START_TEST(subtraction_10_minus_5_equals_5) { RomanNumber rn1 = newRomanNumber("X"); RomanNumber rn2 = newRomanNumber("V"); RomanNumber difference = rnSubtract(rn1, rn2); ck_assert_str_eq("V", to_string(difference)); ck_assert_int_eq(5, to_a(difference)); } END_TEST
} END_TEST /******* First Value has digit multi levels above the largest in Second *******/ START_TEST(create_function_to_breakdown_digit_first_has_digit_multiple_levels_higher) { RomanNumber rn1 = newRomanNumber("L"); RomanNumber rn2 = newRomanNumber("VI"); rnBreakdownDigit(&rn1, &rn2); ck_assert_str_eq("XXXXX", to_string(rn1)); ck_assert_str_eq("VI", to_string(rn2)); } END_TEST
} END_TEST /********** First Value has digit one greater than largest in Second **********/ START_TEST(create_function_to_breakdown_digit_first_has_digit_one_larger) { RomanNumber rn1 = newRomanNumber("LX"); RomanNumber rn2 = newRomanNumber("VI"); rnBreakdownDigit(&rn1, &rn2); ck_assert_str_eq("LVV", to_string(rn1)); ck_assert_str_eq("VI", to_string(rn2)); } END_TEST
} END_TEST /********** None of the values in the Second value exist in the First *********/ START_TEST(test_eleminate_duplictes_where_no_digits_are_in_common) { RomanNumber rn1 = newRomanNumber("LX"); RomanNumber rn2 = newRomanNumber("VI"); rnEliminateDuplicates(&rn1, &rn2); ck_assert_str_eq("LX", to_string(rn1)); ck_assert_str_eq("VI", to_string(rn2)); } END_TEST
} END_TEST /* Some of the values in the Second Value exit in the First but not all of them */ START_TEST(test_eleminate_duplictes_where_only_some_of_second_digits_exist_in_first) { RomanNumber rn1 = newRomanNumber("LXI"); RomanNumber rn2 = newRomanNumber("LVI"); rnEliminateDuplicates(&rn1, &rn2); ck_assert_str_eq("X", to_string(rn1)); ck_assert_str_eq("V", to_string(rn2)); } END_TEST
} END_TEST /** Second value contains only digits that are duplicated in the First Value **/ START_TEST(test_eleminate_duplictes_where_second_is_subset_of_first) { RomanNumber rn1 = newRomanNumber("XVII"); RomanNumber rn2 = newRomanNumber("VI"); rnEliminateDuplicates(&rn1, &rn2); ck_assert_str_eq("XI", to_string(rn1)); ck_assert_str_eq("", to_string(rn2)); } END_TEST
} END_TEST /******** Test Elimination of Duplicates when both values are the same ********/ START_TEST(test_eleminate_duplictes_where_both_values_are_the_same) { RomanNumber rn1 = newRomanNumber("II"); RomanNumber rn2 = newRomanNumber("II"); rnEliminateDuplicates(&rn1, &rn2); ck_assert_str_eq("", to_string(rn1)); ck_assert_str_eq("", to_string(rn2)); } END_TEST
} END_TEST /***** Test Add Function with triple digit numbers, exercising full suite *****/ START_TEST(test_add_function_with_complex_numbers_143_plus_352_equals_495) { RomanNumber rn1 = newRomanNumber("CXLIII"); RomanNumber rn2 = newRomanNumber("CCCLII"); RomanNumber sum = rnAdd(rn1, rn2); ck_assert_str_eq("CDXCV", to_string(sum)); ck_assert_int_eq(495, to_a(sum)); } END_TEST
} END_TEST /*** Test Add Function, using two digit numbers that require simplification ***/ START_TEST(test_add_function_with_moderately_complex_numbers_15_plus_17_equals_32) { RomanNumber rn1 = newRomanNumber("XV"); RomanNumber rn2 = newRomanNumber("XVII"); RomanNumber sum = rnAdd(rn1, rn2); ck_assert_str_eq("XXXII", to_string(sum)); ck_assert_int_eq(32, to_a(sum)); } END_TEST
} END_TEST /**************** Test Add Function, using larger digits, 5+2=7 ***************/ START_TEST(test_add_function_with_simple_math_5_plus_2_equals_7) { RomanNumber rn1 = newRomanNumber("V"); RomanNumber rn2 = newRomanNumber("II"); RomanNumber sum = rnAdd(rn1, rn2); ck_assert_str_eq("VII", to_string(sum)); ck_assert_int_eq(7, to_a(sum)); } END_TEST
} END_TEST /********************** Test Subtract Function, complex results *********************/ START_TEST(subtraction_complex_result) { RomanNumber rn1 = newRomanNumber("CL"); RomanNumber rn2 = newRomanNumber("LX"); RomanNumber difference = rnSubtract(rn1, rn2); ck_assert_str_eq("XC", to_string(difference)); ck_assert_int_eq(90, to_a(difference)); } END_TEST
} END_TEST /******************** Test Subtract Function, start simple 10-1=9 *******************/ START_TEST(subtraction_10_minus_1_equals_9_subtractive_result) { RomanNumber rn1 = newRomanNumber("X"); RomanNumber rn2 = newRomanNumber("I"); RomanNumber difference = rnSubtract(rn1, rn2); ck_assert_str_eq("IX", to_string(difference)); ck_assert_int_eq(9, to_a(difference)); } END_TEST
} END_TEST /******************************************************************************* * Concatinate digits of two values into one new one * ******************************************************************************/ /******** Create a function to create one value from the digits of two ********/ START_TEST(concatinate_all_the_digits_of_two_numbers_into_a_new_value) { RomanNumber rnFirst = newRomanNumber("MDC"); RomanNumber rnSecond = newRomanNumber("LXVI"); RomanNumber concat = rnConcatinate(rnFirst, rnSecond); ck_assert_str_eq("MDCLXVI", to_string(concat)); } END_TEST
} END_TEST /******************************************************************************* * Cancel Redundant digits between two values * ******************************************************************************/ /******** Create a function to eliminate duplicated between two values ********/ START_TEST(create_function_to_erase_duplicate_digits_between_two_values) { RomanNumber rn1 = newRomanNumber("MDCL"); RomanNumber rn2 = newRomanNumber("XVI"); rnEliminateDuplicates(&rn1, &rn2); ck_assert_str_eq("MDCL", to_string(rn1)); ck_assert_str_eq("XVI", to_string(rn2)); } END_TEST
} END_TEST /******************************************************************************* * Use above API to add two roman numbers * ******************************************************************************/ /******************** Test Add Function, start simple 1+1=2 *******************/ START_TEST(create_function_to_add_two_numbers) { RomanNumber rn1 = newRomanNumber("I"); RomanNumber rn2 = newRomanNumber("I"); RomanNumber sum = rnAdd(rn1, rn2); ck_assert_str_eq("II", to_string(sum)); ck_assert_int_eq(2, to_a(sum)); } END_TEST
} END_TEST /********************** Initialize a Complex Number Value *********************/ START_TEST(initialize_a_value_with_complex_structure) { RomanNumber rn = newRomanNumber("MCMXCIX"); ck_assert_int_eq(rn.Size, 7); ck_assert(rn.Digit[0].Symbol == 'M'); ck_assert_int_eq(rn.Digit[0].Value, 1000); ck_assert(rn.Digit[1].Symbol == 'C'); ck_assert_int_eq(rn.Digit[1].Value, -100); ck_assert(rn.Digit[2].Symbol == 'M'); ck_assert_int_eq(rn.Digit[2].Value, 1000); ck_assert(rn.Digit[3].Symbol == 'X'); ck_assert_int_eq(rn.Digit[3].Value, -10); ck_assert(rn.Digit[4].Symbol == 'C'); ck_assert_int_eq(rn.Digit[4].Value, 100); ck_assert(rn.Digit[5].Symbol == 'I'); ck_assert_int_eq(rn.Digit[5].Value, -1); ck_assert(rn.Digit[6].Symbol == 'X'); ck_assert_int_eq(rn.Digit[6].Value, 10); } END_TEST
} END_TEST /******************************************************************************* * Breakdown one digit in the first value, that is larger than the largest in * * the second value * ******************************************************************************/ /* Create function to break down digit in first value larger than largest digit in second value */ START_TEST(create_function_to_breakdown_digit) { RomanNumber rn1 = newRomanNumber("MDCL"); RomanNumber rn2 = newRomanNumber("XVI"); rnBreakdownDigit(&rn1, &rn2); ck_assert_str_eq("MDCXXXXX", to_string(rn1)); ck_assert_str_eq("XVI", to_string(rn2)); } END_TEST
} END_TEST /******************************************************************************* * Use above API to subtract two roman numbers * ******************************************************************************/ /******************** Test Subtract Function, start simple 2-1=1 *******************/ START_TEST(create_function_to_subtract_two_numbers) { RomanNumber rn1 = newRomanNumber("II"); RomanNumber rn2 = newRomanNumber("I"); RomanNumber difference = rnSubtract(rn1, rn2); ck_assert_str_eq("I", to_string(difference)); ck_assert_int_eq(1, to_a(difference)); } END_TEST
} END_TEST /**** Create a number from the string "MCMXCIX" -> toInt should return 1999 ***/ START_TEST(roman_number_MCMXCIX_should_have_value_1999) { RomanNumber rn = newRomanNumber("MCMXCIX"); uint32_t value = to_a(rn); ck_assert_int_eq(value, 1999); } END_TEST
} END_TEST /******** Create a number from the string "VI" -> toInt should return 6 *******/ START_TEST(roman_number_VI_should_have_value_6) { RomanNumber rn = newRomanNumber("VI"); uint32_t value = to_a(rn); ck_assert_int_eq(value, 6); } END_TEST
} END_TEST /************* Test a complex number with multiple substitutions **************/ START_TEST(reintroduce_subtractive_complex_number) { RomanNumber rn = newRomanNumber("MMMDCCCCLXXXXVIII"); rnRewriteSubtractive(&rn); ck_assert_str_eq("MMMCMXCVIII", to_string(rn)); } END_TEST
} END_TEST /*************** Testing Remove Subtractive with complex value ****************/ START_TEST(substitute_for_any_subtractives_complex_subtractive_value) { RomanNumber rn = newRomanNumber("MCMXCIX"); rnRemoveSubtractive(&rn); ck_assert_str_eq("MDCCCCLXXXXVIIII", to_string(rn)); } END_TEST
} END_TEST /* Testing a simple number consisting of only a single value needing conversion */ START_TEST(substitute_for_any_subtractives_simple_subtractive_value) { RomanNumber rn = newRomanNumber("IV"); rnRemoveSubtractive(&rn); ck_assert_str_eq("IIII", to_string(rn)); } END_TEST
} END_TEST /*** A single digit can not be out of order, so it should not change value ****/ START_TEST(substitute_for_any_subtractives_single_digit_value) { RomanNumber rn = newRomanNumber("I"); rnRemoveSubtractive(&rn); ck_assert_str_eq("I", to_string(rn)); } END_TEST
} END_TEST /***** Initialize a simple value then check the structure that comes back *****/ START_TEST(initialize_roman_number_with_a_simple_single_digit_value) { RomanNumber rn = newRomanNumber("I"); ck_assert_int_eq(rn.Size, 1); ck_assert(rn.Digit[0].Symbol == 'I'); ck_assert_int_eq(rn.Digit[0].Value, 1); } END_TEST