intptr_t _mock(const char *function, const char *parameters, ...) { unwanted_check(function); RecordedExpectation *expectation = find_expectation(function); if (expectation != NULL) { Vector *names = create_vector_of_names(parameters); int i; va_list actual; va_start(actual, parameters); for (i = 0; i < vector_size(names); i++) { apply_any_constraints(expectation, vector_get(names, i), va_arg(actual, intptr_t)); } va_end(actual); destroy_vector(names); } return stubbed_result(function); }
intptr_t mock_(const char *function, const char *parameters, ...) { RecordedExpectation *expectation = NULL; unwanted_check(function); expectation = find_expectation(function); if (expectation != NULL) { CgreenVector *names = create_vector_of_names(parameters); int i; va_list actual; va_start(actual, parameters); for (i = 0; i < cgreen_vector_size(names); i++) { apply_any_constraints(expectation, (const char *)cgreen_vector_get(names, i), va_arg(actual, intptr_t)); } va_end(actual); destroy_cgreen_vector(names); if (! expectation->should_keep) { destroy_expectation(expectation); } } return stubbed_result(function); }
intptr_t mock_(TestReporter* test_reporter, const char *function, const char *mock_file, int mock_line, const char *parameters, ...) { va_list actuals; CgreenVector *actual_values; CgreenVector *parameter_names; int failures_before_read_only_constraints_executed; int failures_after_read_only_constraints_executed; int i; intptr_t stored_result; RecordedExpectation *expectation = find_expectation(function); va_start(actuals, parameters); actual_values = create_vector_of_actuals(actuals, number_of_parameters_in(parameters)); va_end(actuals); parameter_names = create_vector_of_names(parameters); if (expectation == NULL) { handle_missing_expectation_for(function, mock_file, mock_line, parameter_names, actual_values, test_reporter); destroy_cgreen_vector(actual_values); destroy_cgreen_vector(parameter_names); return 0; } if (is_never_call(expectation)) { report_violated_never_call(test_reporter, expectation); destroy_cgreen_vector(actual_values); destroy_cgreen_vector(parameter_names); return 0; } ensure_successfully_mocked_calls_list_exists(); cgreen_vector_add(successfully_mocked_calls, (void*)function); stored_result = stored_result_or_default_for(expectation->constraints); for (i = 0; i < cgreen_vector_size(expectation->constraints); i++) { Constraint *constraint = (Constraint *)cgreen_vector_get(expectation->constraints, i); if (!is_parameter(constraint)) continue; if (!constraint_is_for_parameter_in(constraint, parameters)) { // if expectation parameter name isn't in parameter_names, // fail test and skip applying constraints unlikely to match report_mock_parameter_name_not_found(test_reporter, expectation, constraint->parameter_name); destroy_expectation_if_time_to_die(expectation); destroy_cgreen_vector(actual_values); destroy_cgreen_vector(parameter_names); return stored_result; } } // if read-only constraints aren't matching, content-setting ones might corrupt memory // apply read-only ones first, and if they don't fail, then do the deeper constraints failures_before_read_only_constraints_executed = test_reporter->failures; for (i = 0; i < cgreen_vector_size(parameter_names); i++) { const char* parameter_name = (const char*)cgreen_vector_get(parameter_names, i); uintptr_t actual = (uintptr_t)cgreen_vector_get(actual_values, i); apply_any_read_only_parameter_constraints(expectation, parameter_name, actual, test_reporter); } failures_after_read_only_constraints_executed = test_reporter->failures; // FIXME: this comparison doesn't work because only parent processes' pass/fail counts are updated, // and even then only once they read from the pipe if (failures_before_read_only_constraints_executed == failures_after_read_only_constraints_executed) { for (i = 0; i < cgreen_vector_size(parameter_names); i++) { const char* parameter_name = (const char*)cgreen_vector_get(parameter_names, i); uintptr_t actual = (uintptr_t)cgreen_vector_get(actual_values, i); apply_any_content_setting_parameter_constraints(expectation, parameter_name, actual, test_reporter); } } destroy_cgreen_vector(parameter_names); destroy_cgreen_vector(actual_values); destroy_expectation_if_time_to_die(expectation); return stored_result; }