diff --git a/test/growth/growth_test.exs b/test/growth/growth_test.exs new file mode 100644 index 0000000..3752689 --- /dev/null +++ b/test/growth/growth_test.exs @@ -0,0 +1,131 @@ +defmodule GrowthTest do + @moduledoc false + + use ExUnit.Case, async: true + + doctest Growth + + @child %{ + name: "Jane Doe", + gender: :female, + date_of_measurement: Date.utc_today(), + age_in_days: 91, + weight: 5.84, + height: 59.78, + head_circumference: 39.51, + arm_circumference: 13.02, + subscapular_skinfold: 7.79, + triceps_skinfold: 9.75 + } + @child_date_of_birth Date.shift(@child.date_of_measurement, day: @child.age_in_days * -1) + + describe "new/4" do + test "create a new growth measurement" do + growth = + Growth.new(@child.name, @child.gender, @child_date_of_birth, + date_of_measurement: @child.date_of_measurement, + weight: @child.weight, + height: @child.height, + head_circumference: @child.head_circumference, + arm_circumference: @child.arm_circumference, + subscapular_skinfold: @child.subscapular_skinfold, + triceps_skinfold: @child.triceps_skinfold + ) + + assert @child.name == growth.name + assert @child.gender == growth.gender + assert @child_date_of_birth == growth.date_of_birth + assert @child.date_of_measurement == growth.date_of_measurement + assert @child.age_in_days == growth.age_in_days + assert 13 == growth.age_in_weeks + assert 2 == growth.age_in_months + assert @child.weight == growth.weight + assert @child.height == growth.height + assert @child.head_circumference == growth.head_circumference + assert @child.arm_circumference == growth.arm_circumference + assert @child.subscapular_skinfold == growth.subscapular_skinfold + assert @child.triceps_skinfold == growth.triceps_skinfold + end + end + + describe "with_bmi/1" do + test "calculate bmi from measurement" do + growth = + %Growth{ + name: @child.name, + gender: @child.gender, + date_of_birth: @child_date_of_birth, + date_of_measurement: @child.date_of_measurement, + weight: @child.weight, + height: @child.height, + head_circumference: @child.head_circumference, + arm_circumference: @child.arm_circumference, + subscapular_skinfold: @child.subscapular_skinfold, + triceps_skinfold: @child.triceps_skinfold + } + |> Growth.with_age_in_days() + |> Growth.with_age_in_weeks() + |> Growth.with_age_in_months() + |> Growth.with_bmi() + + assert 16.341842694989243 == growth.bmi + end + end + + describe "with_results/1" do + test "calculate z-score and percentiles from measurement" do + growth = + %Growth{ + name: @child.name, + gender: @child.gender, + date_of_birth: @child_date_of_birth, + date_of_measurement: @child.date_of_measurement, + weight: @child.weight, + height: @child.height, + head_circumference: @child.head_circumference, + arm_circumference: @child.arm_circumference, + subscapular_skinfold: @child.subscapular_skinfold, + triceps_skinfold: @child.triceps_skinfold, + results: [] + } + |> Growth.with_age_in_days() + |> Growth.with_age_in_weeks() + |> Growth.with_age_in_months() + |> Growth.with_bmi() + |> Growth.with_results() + + assert [ + day: {9.496948997971584e-4, 0.5003788733920584}, + week: {9.496948997971584e-4, 0.5003788733920584}, + month: {1.0060928051683196, 0.8428145353253619} + ] == Keyword.get(growth.results, :weight) + + assert [ + day: {0.0012831717968983271, 0.5005119113423219}, + week: {0.0012831717968983271, 0.5005119113423219}, + month: {1.3322618635180914, 0.9086129228760054} + ] == Keyword.get(growth.results, :height) + + assert [ + day: {-0.007440424136462911, 0.4970317276150869}, + week: {-0.007440424136462911, 0.4970317276150869}, + month: {0.3827194919327071, 0.6490361198066796} + ] == Keyword.get(growth.results, :bmi) + + assert [ + day: {-0.008864109494641385, 0.4964637782528006}, + week: {-0.008864109494641385, 0.4964637782528006}, + month: {1.0380198575748647, 0.8503695948597997} + ] == Keyword.get(growth.results, :head_circumference) + + assert [day: {-0.004182676756535293, 0.49833135826198854}] == + Keyword.get(growth.results, :arm_circumference) + + assert [day: {0.001811404894950268, 0.5007226456043324}] == + Keyword.get(growth.results, :subscapular_skinfold) + + assert [day: {-0.0019309186728254878, 0.49922967538007906}] == + Keyword.get(growth.results, :triceps_skinfold) + end + end +end