mirror of https://github.com/kcal-app/kcal.git
				
				
				
			
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace Tests\Feature\Support;
 | |
| 
 | |
| use App\Models\Food;
 | |
| use App\Support\Nutrients;
 | |
| use Illuminate\Foundation\Testing\RefreshDatabase;
 | |
| use Tests\TestCase;
 | |
| 
 | |
| class NutrientsTest extends TestCase
 | |
| {
 | |
|     use RefreshDatabase;
 | |
| 
 | |
|     /**
 | |
|      * Test invalid Food nutrient multiplier calculation.
 | |
|      *
 | |
|      * @dataProvider foodsInvalidNutrientMultipliersProvider
 | |
|      */
 | |
|     public function testCalculateFoodInvalidNutrientMultiplier(
 | |
|         Food $food,
 | |
|         float $amount,
 | |
|         string $fromUnit,
 | |
|     ): void {
 | |
|         $this->expectException(\DomainException::class);
 | |
|         Nutrients::calculateFoodNutrientMultiplier($food, $amount, $fromUnit);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test valid Food nutrient multiplier calculation.
 | |
|      *
 | |
|      * @dataProvider foodsValidNutrientMultipliersProvider
 | |
|      */
 | |
|     public function testCalculateFoodValidNutrientMultiplier(
 | |
|         Food $food,
 | |
|         float $amount,
 | |
|         string $fromUnit,
 | |
|         float $expectedMultiplier
 | |
|     ): void {
 | |
|         $this->assertEquals(
 | |
|             Nutrients::calculateFoodNutrientMultiplier($food, $amount, $fromUnit),
 | |
|             $expectedMultiplier
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Data providers.
 | |
|      */
 | |
| 
 | |
|     /**
 | |
|      * Provide example foods and expected nutrient multipliers.
 | |
|      */
 | |
|     public function foodsInvalidNutrientMultipliersProvider(): array {
 | |
|         $this->refreshApplication();
 | |
| 
 | |
|         /** @var \App\Models\Food $foodInvalidUnit */
 | |
|         $foodInvalidUnit = Food::factory()->make(['serving_unit' => 'invalid']);
 | |
| 
 | |
|         return [
 | |
|             [$foodInvalidUnit, 1, 'tsp'],
 | |
|             [$foodInvalidUnit, 1, 'tbsp'],
 | |
|             [$foodInvalidUnit, 1, 'cup'],
 | |
|             [Food::factory()->tspServingUnit()->make(), 1, 'invalid'],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Provide example foods and expected nutrient multipliers.
 | |
|      */
 | |
|     public function foodsValidNutrientMultipliersProvider(): array {
 | |
|         $this->refreshApplication();
 | |
| 
 | |
|         /** @var \App\Models\Food[] $foods */
 | |
|         $foods = [
 | |
|             'tsp' => Food::factory()->tspServingUnit()->make(),
 | |
|             'tbsp' => Food::factory()->tbspServingUnit()->make(),
 | |
|             'cup' => Food::factory()->cupServingUnit()->make(),
 | |
|             'none' => Food::factory()->noServingUnit()->make(),
 | |
|         ];
 | |
| 
 | |
|         return [
 | |
|             [$foods['tsp'], $foods['tsp']->serving_weight, 'oz', Nutrients::$gramsPerOunce],
 | |
|             [$foods['tsp'], 1, 'serving', 1],
 | |
|             [$foods['tsp'], $foods['tsp']->serving_weight * 1.5, 'gram', 1.5],
 | |
|             [$foods['tsp'], 2, 'tsp', 2],
 | |
|             [$foods['tsp'], 1, 'tbsp', 3],
 | |
|             [$foods['tsp'], 1, 'cup', 48],
 | |
|             [$foods['tbsp'], $foods['tbsp']->serving_weight, 'oz', Nutrients::$gramsPerOunce],
 | |
|             [$foods['tbsp'], 1, 'serving', 1],
 | |
|             [$foods['tbsp'], $foods['tbsp']->serving_weight * 2, 'gram', 2],
 | |
|             [$foods['tbsp'], 2, 'tsp', 2/3],
 | |
|             [$foods['tbsp'], 1, 'tbsp', 1],
 | |
|             [$foods['tbsp'], 2, 'cup', 32],
 | |
|             [$foods['cup'], $foods['cup']->serving_weight, 'oz', Nutrients::$gramsPerOunce],
 | |
|             [$foods['cup'], 1, 'serving', 1],
 | |
|             [$foods['cup'], $foods['cup']->serving_weight * 2.25, 'gram', 2.25],
 | |
|             [$foods['cup'], 3, 'tsp', 1/16],
 | |
|             [$foods['cup'], 2, 'tbsp', 1/8],
 | |
|             [$foods['cup'], 5, 'cup', 5],
 | |
|             [$foods['none'], $foods['none']->serving_weight, 'oz', Nutrients::$gramsPerOunce],
 | |
|             [$foods['none'], 1, 'serving', 1],
 | |
|             [$foods['none'], $foods['none']->serving_weight * 3.0125, 'gram', 3.0125],
 | |
|         ];
 | |
|     }
 | |
| }
 |