calculateFamilyTuition([ ['student_id' => 4, 'student_name' => 'Fourth', 'grade_level' => '4'], ['student_id' => 1, 'student_name' => 'First', 'grade_level' => '1'], ['student_id' => 3, 'student_name' => 'Third', 'grade_level' => '3'], ['student_id' => 2, 'student_name' => 'Second', 'grade_level' => '2'], ], [ 'grade_fee' => 9, 'new_tuition_full_amount' => '380.00', 'new_tuition_second_student_discount' => '100.00', ]); $this->assertSame('1220.00', $result['total']); $this->assertSame('380.00', $result['details'][0]['amount']); $this->assertSame('280.00', $result['details'][1]['amount']); $this->assertSame('280.00', $result['details'][2]['amount']); $this->assertSame('280.00', $result['details'][3]['amount']); $this->assertSame('new_first_student_full_amount', $result['details'][0]['rule']); $this->assertSame('new_additional_student_discount', $result['details'][1]['rule']); } public function testDiscountCannotDriveAmountBelowZero(): void { $service = new NewTuitionCalculatorService(); $result = $service->calculateFamilyTuition([ ['student_id' => 1, 'student_name' => 'One', 'grade_level' => '1'], ['student_id' => 2, 'student_name' => 'Two', 'grade_level' => '2'], ['student_id' => 3, 'student_name' => 'Three', 'grade_level' => '3'], ], [ 'grade_fee' => 9, 'new_tuition_full_amount' => '75.00', 'new_tuition_second_student_discount' => '100.00', ]); $this->assertSame('75.00', $result['total']); $this->assertSame('75.00', $result['details'][0]['amount']); $this->assertSame('0.00', $result['details'][1]['amount']); $this->assertSame('0.00', $result['details'][2]['amount']); } public function testYouthStudentsUseTheSameFamilyTuitionRule(): void { $service = new NewTuitionCalculatorService(); $result = $service->calculateFamilyTuition([ ['student_id' => 3, 'student_name' => 'Youth', 'grade_level' => 'Youth 1'], ['student_id' => 1, 'student_name' => 'Regular One', 'grade_level' => '2'], ['student_id' => 2, 'student_name' => 'Regular Two', 'grade_level' => '5'], ], [ 'grade_fee' => 9, 'new_tuition_full_amount' => '380.00', 'new_tuition_second_student_discount' => '100.00', ]); $this->assertSame('940.00', $result['total']); $this->assertSame('380.00', $result['details'][0]['amount']); $this->assertSame('280.00', $result['details'][1]['amount']); $this->assertSame('280.00', $result['details'][2]['amount']); $this->assertSame('new_additional_student_discount', $result['details'][2]['rule']); } public function testGradeStudentAndYouthStudentAreTwoFamilyStudents(): void { $service = new NewTuitionCalculatorService(); $result = $service->calculateFamilyTuition([ ['student_id' => 1, 'student_name' => 'Grade Student', 'grade_level' => '4'], ['student_id' => 2, 'student_name' => 'Youth Student', 'grade_level' => 'Youth 1'], ], [ 'grade_fee' => 9, 'new_tuition_full_amount' => '380.00', 'new_tuition_second_student_discount' => '100.00', ]); $this->assertSame('660.00', $result['total']); $this->assertSame('380.00', $result['details'][0]['amount']); $this->assertSame('280.00', $result['details'][1]['amount']); } }