package patterns_test import ( "testing" "gitty.informatik.hs-mannheim.de/steger/pr3-code/go/04-design-pattern/patterns" ) type valueCalc float64 func (v valueCalc) Calc() float64 { return float64(v) } func TestCompositeCalculator_Empty(t *testing.T) { empty := patterns.NewCompositeCalculator(5.0, func(a, b float64) float64 { return a + b }) got := empty.Calc() want := 5.0 if got != want { t.Errorf("Empty: got %v, want %v", got, want) } } func TestCompositeCalculator_Addition(t *testing.T) { add := patterns.NewCompositeCalculatorFromOperator("+") add.Add(valueCalc(5)) add.Add(valueCalc(3)) add.Add(valueCalc(2)) got := add.Calc() want := 10.0 if got != want { t.Errorf("Addition: got %v, want %v", got, want) } } func TestCompositeCalculator_Multiplication(t *testing.T) { mul := patterns.NewCompositeCalculatorFromOperator("*") mul.Add(valueCalc(2)) mul.Add(valueCalc(3)) mul.Add(valueCalc(4)) got := mul.Calc() want := 24.0 if got != want { t.Errorf("Multiplication: got %v, want %v", got, want) } } func TestCompositeCalculator_Nested(t *testing.T) { // + 5 3 2 * 2 3 + 4 4 = 5 + 3 + 2 + (2 * 3 * (4+4)) = 5+3+2+48 = 58 add := patterns.NewCompositeCalculatorFromOperator("+") add.Add(valueCalc(5)) add.Add(valueCalc(3)) add.Add(valueCalc(2)) mul := patterns.NewCompositeCalculatorFromOperator("*") mul.Add(valueCalc(2)) mul.Add(valueCalc(3)) add2 := patterns.NewCompositeCalculatorFromOperator("+") add2.Add(valueCalc(4)) add2.Add(valueCalc(4)) mul.Add(add2) add.Add(mul) got := add.Calc() want := 58.0 if got != want { t.Errorf("Nested: got %v, want %v", got, want) } }