mirror of https://github.com/kcal-app/kcal.git
				
				
				
			
		
			
				
	
	
		
			162 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace Tests\Feature\Support;
 | |
| 
 | |
| use App\Models\Food;
 | |
| use App\Models\IngredientAmount;
 | |
| use App\Models\Recipe;
 | |
| use App\Support\Nutrients;
 | |
| use Tests\TestCase;
 | |
| 
 | |
| class NutrientsTest extends TestCase
 | |
| {
 | |
| 
 | |
|     /**
 | |
|      * 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(
 | |
|             $expectedMultiplier,
 | |
|             Nutrients::calculateFoodNutrientMultiplier($food, $amount, $fromUnit)
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test valid Recipe nutrient amount calculation.
 | |
|      *
 | |
|      * @dataProvider recipesValidRecipeNutrientAmountsProvider
 | |
|      */
 | |
|     public function testCalculateValidRecipeNutrientAmount(
 | |
|         string $nutrient,
 | |
|         float $amount,
 | |
|         string $fromUnit,
 | |
|         float $expectedAmount
 | |
|     ): void {
 | |
|         /** @var \App\Models\Recipe $recipe */
 | |
|         $recipe = Recipe::factory()
 | |
|             ->create(['volume' => 2, 'weight' => 400]);
 | |
|         /** @var \App\Models\Food $food */
 | |
|         $food = Food::factory()->create([
 | |
|             'calories' => 20,
 | |
|             'carbohydrates' => 20,
 | |
|             'cholesterol' => 200,
 | |
|             'fat' => 20,
 | |
|             'protein' => 20,
 | |
|             'sodium' => 200,
 | |
|         ]);
 | |
|         $ingredient = new IngredientAmount();
 | |
|         $ingredient->fill([
 | |
|             'amount' => 1,
 | |
|             'unit' => 'serving',
 | |
|             'weight' => 0,
 | |
|         ])->ingredient()->associate($food);
 | |
|         $recipe->ingredientAmounts()->save($ingredient);
 | |
| 
 | |
|         $this->assertEquals(
 | |
|             $expectedAmount,
 | |
|             Nutrients::calculateRecipeNutrientAmount($recipe, $nutrient, $amount, $fromUnit)
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Data providers.
 | |
|      */
 | |
| 
 | |
|     /**
 | |
|      * Provide example recipe and expected nutrient amounts.
 | |
|      */
 | |
|     public function recipesValidRecipeNutrientAmountsProvider(): array {
 | |
|         return [
 | |
|             ['calories', 1, 'cup', 10],
 | |
|             ['calories', 2, 'cup', 20],
 | |
|             ['carbohydrates', 8, 'tbsp', 5],
 | |
|             ['carbohydrates', 16, 'tbsp', 10],
 | |
|             ['cholesterol', 48, 'tsp', 100],
 | |
|             ['cholesterol', 96, 'tsp', 200],
 | |
|             ['fat', 100, 'gram', 5],
 | |
|             ['fat', 200, 'gram', 10],
 | |
|             ['protein', 100, 'gram', 5],
 | |
|             ['protein', 200, 'gram', 10],
 | |
|             ['sodium', 2, 'oz', Nutrients::$gramsPerOunce],
 | |
|             ['sodium', 4, 'oz', Nutrients::$gramsPerOunce * 2],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 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()->make(['serving_unit' => 'tsp', 'serving_size' => 1]), 1, 'invalid'],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Provide example foods and expected nutrient multipliers.
 | |
|      */
 | |
|     public function foodsValidNutrientMultipliersProvider(): array {
 | |
|         $this->refreshApplication();
 | |
| 
 | |
|         /** @var \App\Models\Food[] $foods */
 | |
|         $foods = [
 | |
|             'tsp' => Food::factory()->make(['serving_unit' => 'tsp', 'serving_size' => 1]),
 | |
|             'tbsp' => Food::factory()->make(['serving_unit' => 'tbsp', 'serving_size' => 1]),
 | |
|             'cup' => Food::factory()->make(['serving_unit' => 'cup', 'serving_size' => 1]),
 | |
|             'none' => Food::factory()->make(['serving_unit' => null, 'serving_unit_name' => 'head']),
 | |
|         ];
 | |
| 
 | |
|         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],
 | |
|         ];
 | |
|     }
 | |
| }
 |