package financial import ( "testing" ) func TestCO2Calculator_CalculateCO2Reduction(t *testing.T) { config := DefaultConfig() cc := NewCO2Calculator(config) tests := []struct { name string resourceType string annualVolume float64 expectedMin float64 expectedMax float64 }{ { name: "Heat energy", resourceType: "heat", annualVolume: 1000.0, expectedMin: 189.0, // 1000 MWh * 0.3 t/MWh * 0.9 efficiency * 0.7 utilization expectedMax: 191.0, }, { name: "Steam energy", resourceType: "steam", annualVolume: 1000.0, expectedMin: 189.0, expectedMax: 191.0, }, { name: "Water treatment", resourceType: "water", annualVolume: 1000000.0, // 1 million liters expectedMin: 300.0, // 1M liters * 1 kWh/m³ * 0.3 t/MWh / 1000 expectedMax: 310.0, }, { name: "Biowaste", resourceType: "biowaste", annualVolume: 1000.0, // 1000 tonnes expectedMin: 500.0, // 1000 tonnes * 0.5 t CO2/tonne expectedMax: 510.0, }, { name: "Cooling", resourceType: "cooling", annualVolume: 1000.0, expectedMin: 189.0, expectedMax: 191.0, }, { name: "Unknown resource", resourceType: "unknown", annualVolume: 1000.0, expectedMin: 0.0, expectedMax: 0.1, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result := cc.CalculateCO2Reduction(tt.resourceType, tt.annualVolume) if result < tt.expectedMin || result > tt.expectedMax { t.Errorf("CalculateCO2Reduction(%s, %v) = %v, expected between %v and %v", tt.resourceType, tt.annualVolume, result, tt.expectedMin, tt.expectedMax) } }) } } func TestCO2Calculator_ZeroVolume(t *testing.T) { config := DefaultConfig() cc := NewCO2Calculator(config) result := cc.CalculateCO2Reduction("heat", 0.0) if result != 0.0 { t.Errorf("CalculateCO2Reduction with zero volume = %v, want 0.0", result) } } func TestCO2Calculator_NegativeVolume(t *testing.T) { config := DefaultConfig() cc := NewCO2Calculator(config) result := cc.CalculateCO2Reduction("heat", -1000.0) if result != 0.0 { t.Errorf("CalculateCO2Reduction with negative volume = %v, want 0.0", result) } }