def test_invalid_formulas(formula_data, exception, formula, absorb): """Test that an invalid formula gives rise to an exception.""" try: formulation = Formulation(formula, absorb) formulation._build_matrix(formula_data) if absorb is not None: formulation._build_ids(formula_data) except exception: print(traceback.format_exc()) return raise RuntimeError(f"Successful formulation: {formulation}.")
def test_ids( formula_data: Data, formulas: Iterable[str], build_columns: Callable[[Mapping[str, Array]], Sequence[Array]]) -> None: """Test that equivalent formulas build IDs as expected.""" # create convenience columns of tuples of categorical variables formula_data = copy.deepcopy(formula_data) for (key1, values1), (key2, values2), (key3, values3) in itertools.product( formula_data.items(), repeat=3): key12 = f'{key1}{key2}' key123 = f'{key1}{key2}{key3}' if key12 not in formula_data: values12 = np.empty_like(values1, np.object_) values12[:] = list(zip(values1, values2)) formula_data[key12] = values12 if key123 not in formula_data: values123 = np.empty_like(values1, np.object_) values123[:] = list(zip(values1, values2, values3)) formula_data[key123] = values123 # build and compare columns for each formula, making sure that it can be formatted for absorb in formulas: formulation = Formulation('x', absorb) assert str(formulation) ids = formulation._build_ids(formula_data) expected_ids = np.column_stack(build_columns(formula_data)) np.testing.assert_array_equal(ids, expected_ids, err_msg=absorb)