// 23pattern_test
package pattern


import "testing"

func TestCreationalPatterns(t *testing.T) {
	// Singleton
	s1 := GetInstance()
	s2 := GetInstance()
	if s1 != s2 {
		t.Error("Singleton instances should be the same")
	}

	// Factory Method
	dog := CreateAnimal("dog")
	if dog.Speak() != "Woof!" {
		t.Error("Dog should say Woof!")
	}

	// Builder
	house := NewHouseBuilder().
		SetWindows(4).
		SetDoors(2).
		SetRoof("slate").
		Build()
	if house.windows != 4 {
		t.Error("House should have 4 windows")
	}
}

func TestStructuralPatterns(t *testing.T) {
	// Adapter
	printer := &PrinterAdapter{&MyLegacyPrinter{}}
	result := printer.PrintModern("test")
	if result != "Legacy: test" {
		t.Error("Adapter pattern failed")
	}

	// Decorator
	coffee := &SimpleCoffee{}
	coffeeWithMilk := &MilkDecorator{coffee: coffee}
	if coffeeWithMilk.Cost() != 7 {
		t.Error("Coffee with milk should cost 7")
	}
}

func TestBehavioralPatterns(t *testing.T) {
	// Strategy
	strategyA := &ConcreteStrategyA{}
	if strategyA.Execute() != "Strategy A" {
		t.Error("Strategy A failed")
	}

	// State
	context := &Context{state: &ConcreteStateA{}}
	if context.state.Handle() != "State A" {
		t.Error("State pattern failed")
	}
}

