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],
|
|
];
|
|
}
|
|
}
|