From a1dc06a63993a50969d2d2357c3db4313dceba24 Mon Sep 17 00:00:00 2001 From: seb Date: Mon, 30 Apr 2018 23:50:34 +0200 Subject: [PATCH 1/3] Change test for Big Natural generator With implemented random seed feature previous test fails for every start seed other than 1. --- test/orangeade/generator/big_natural_test.exs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/test/orangeade/generator/big_natural_test.exs b/test/orangeade/generator/big_natural_test.exs index d2f737e..89babd4 100644 --- a/test/orangeade/generator/big_natural_test.exs +++ b/test/orangeade/generator/big_natural_test.exs @@ -1,16 +1,19 @@ defmodule Orangeade.Generator.BigNaturalTest do - use ExUnit.Case, async: true - import Orangeade.Generator.BigNatural, only: [stream: 0] + use ExUnit.Case + alias Orangeade.Generator.BigNatural - test "check 5 first generated elements" do - generated = Caffeine.Stream.take(stream(), 5) + test "generated elements are always natural" do + list_of_elements = + BigNatural.stream() + |> Caffeine.Stream.take(10) + assert Enum.all?(list_of_elements, &is_natural/1) + end + + defp is_natural(n) when n >= 0 do + true + end - assert generated == [ - 1, - 7_806_831_264_735_756_412, - 9_396_908_728_118_811_419, - 11_960_119_808_228_829_710, - 7_062_582_979_898_595_269 - ] + defp is_natural(_n) do + false end end From 560c54dd6e8cf18e1303552af76a1e92ec260757 Mon Sep 17 00:00:00 2001 From: seb Date: Wed, 2 May 2018 14:21:21 +0200 Subject: [PATCH 2/3] Add simple configuration realated to start seed Now the supervisor is given a default start seed from config.exs or a seed from Ex.Unit in test environment. --- config/config.exs | 6 ++++++ config/dev.exs | 1 + config/prod.exs | 1 + config/test.exs | 4 ++++ lib/orangeade.ex | 6 +++++- lib/orangeade/{ => application}/seed_state.ex | 6 +++--- lib/orangeade/application/supervisor.ex | 18 ++++++++++++++++++ lib/orangeade/generator/big_natural.ex | 2 +- lib/orangeade/generator/bound_natural.ex | 2 +- lib/orangeade/supervisor.ex | 18 ------------------ .../{ => application}/seed_state_test.exs | 4 ++-- test/test_helper.exs | 3 ++- 12 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 config/config.exs create mode 100644 config/dev.exs create mode 100644 config/prod.exs create mode 100644 config/test.exs rename lib/orangeade/{ => application}/seed_state.ex (86%) create mode 100644 lib/orangeade/application/supervisor.ex delete mode 100644 lib/orangeade/supervisor.ex rename test/orangeade/{ => application}/seed_state_test.exs (74%) diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..157f5ec --- /dev/null +++ b/config/config.exs @@ -0,0 +1,6 @@ +use Mix.Config + +config :orangeade, + default_start_seed: 1 + +import_config "#{Mix.env}.exs" diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 0000000..d2d855e --- /dev/null +++ b/config/dev.exs @@ -0,0 +1 @@ +use Mix.Config diff --git a/config/prod.exs b/config/prod.exs new file mode 100644 index 0000000..d2d855e --- /dev/null +++ b/config/prod.exs @@ -0,0 +1 @@ +use Mix.Config diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 0000000..8a66a21 --- /dev/null +++ b/config/test.exs @@ -0,0 +1,4 @@ +use Mix.Config + +config :orangeade, + default_start_seed: ExUnit.configuration()[:seed] diff --git a/lib/orangeade.ex b/lib/orangeade.ex index 4a1c713..5dd6393 100644 --- a/lib/orangeade.ex +++ b/lib/orangeade.ex @@ -20,6 +20,10 @@ defmodule Orangeade do defdelegate term(), to: Gen.Term, as: :stream def start(_type, _args) do - Orangeade.Supervisor.start_link(1) + Orangeade.Application.Supervisor.start_link(start_seed: get_default_seed()) + end + + defp get_default_seed do + Application.get_env(:orangeade, :default_start_seed) end end diff --git a/lib/orangeade/seed_state.ex b/lib/orangeade/application/seed_state.ex similarity index 86% rename from lib/orangeade/seed_state.ex rename to lib/orangeade/application/seed_state.ex index 0d75ddf..b6d074b 100644 --- a/lib/orangeade/seed_state.ex +++ b/lib/orangeade/application/seed_state.ex @@ -1,4 +1,4 @@ -defmodule Orangeade.SeedState do +defmodule Orangeade.Application.SeedState do use Agent alias Psi.LinearCongruentialGenerator, as: LCG @@ -7,12 +7,12 @@ defmodule Orangeade.SeedState do Starts a new seed state which is a big natural numbers stream which is created with start_seed passed by supervisor. """ - def start_link(start_seed: start_seed) do + def start_link(start_seed: seed) do Agent.start_link( fn -> LCG.stream( generator: Orangeade.Generator.BigNatural.instance(), - seed: start_seed + seed: seed ) end, name: __MODULE__ diff --git a/lib/orangeade/application/supervisor.ex b/lib/orangeade/application/supervisor.ex new file mode 100644 index 0000000..f812bb0 --- /dev/null +++ b/lib/orangeade/application/supervisor.ex @@ -0,0 +1,18 @@ +defmodule Orangeade.Application.Supervisor do + use Supervisor + + def start_link(start_seed: seed) do + Supervisor.start_link(__MODULE__, seed) + end + + def init(seed) do + children = [ + %{ + id: SeedState, + start: {Orangeade.Application.SeedState, :start_link, [[start_seed: seed]]} + } + ] + + Supervisor.init(children, strategy: :one_for_one) + end +end diff --git a/lib/orangeade/generator/big_natural.ex b/lib/orangeade/generator/big_natural.ex index a2385ac..a4f8079 100644 --- a/lib/orangeade/generator/big_natural.ex +++ b/lib/orangeade/generator/big_natural.ex @@ -2,7 +2,7 @@ defmodule Orangeade.Generator.BigNatural do alias Psi.LinearCongruentialGenerator, as: LCG def stream() do - alias Orangeade.SeedState + alias Orangeade.Application.SeedState seed = SeedState.get_next() LCG.stream(generator: Orangeade.Generator.BigNatural.instance(), seed: seed) diff --git a/lib/orangeade/generator/bound_natural.ex b/lib/orangeade/generator/bound_natural.ex index 0ca0907..b0515e9 100644 --- a/lib/orangeade/generator/bound_natural.ex +++ b/lib/orangeade/generator/bound_natural.ex @@ -1,7 +1,7 @@ defmodule Orangeade.Generator.BoundNatural do def stream(limit: i) do alias Psi.LinearCongruentialGenerator, as: LCG - alias Orangeade.SeedState + alias Orangeade.Application.SeedState seed = SeedState.get_next() s = LCG.stream(generator: Orangeade.Generator.BigNatural.instance(), seed: seed) diff --git a/lib/orangeade/supervisor.ex b/lib/orangeade/supervisor.ex deleted file mode 100644 index fdbdbd9..0000000 --- a/lib/orangeade/supervisor.ex +++ /dev/null @@ -1,18 +0,0 @@ -defmodule Orangeade.Supervisor do - use Supervisor - - def start_link(start_seed) do - Supervisor.start_link(__MODULE__, start_seed) - end - - def init(start_seed) do - children = [ - %{ - id: SeedState, - start: {Orangeade.SeedState, :start_link, [[start_seed: start_seed]]} - } - ] - - Supervisor.init(children, strategy: :one_for_one) - end -end diff --git a/test/orangeade/seed_state_test.exs b/test/orangeade/application/seed_state_test.exs similarity index 74% rename from test/orangeade/seed_state_test.exs rename to test/orangeade/application/seed_state_test.exs index 6452228..0126321 100644 --- a/test/orangeade/seed_state_test.exs +++ b/test/orangeade/application/seed_state_test.exs @@ -1,7 +1,7 @@ -defmodule Orangeade.SeedStateTest do +defmodule Orangeade.Application.SeedStateTest do use ExUnit.Case - alias Orangeade.SeedState + alias Orangeade.Application.SeedState test "Check if each next seed from get_next/1 is different" do list_of_seeds = for _n <- 1..100, do: SeedState.get_next() diff --git a/test/test_helper.exs b/test/test_helper.exs index 869559e..20f76e1 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1 +1,2 @@ -ExUnit.start() +seed = Application.get_env(:orangeade, :default_start_seed) +ExUnit.start(seed: seed) From eab05829b759808eaf533346f825533e433d5368 Mon Sep 17 00:00:00 2001 From: seb Date: Wed, 2 May 2018 14:27:11 +0200 Subject: [PATCH 3/3] Apply mix format --- config/config.exs | 5 ++--- config/test.exs | 3 +-- lib/orangeade.ex | 2 +- test/orangeade/generator/big_natural_test.exs | 1 + 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/config/config.exs b/config/config.exs index 157f5ec..7162132 100644 --- a/config/config.exs +++ b/config/config.exs @@ -1,6 +1,5 @@ use Mix.Config -config :orangeade, - default_start_seed: 1 +config :orangeade, default_start_seed: 1 -import_config "#{Mix.env}.exs" +import_config "#{Mix.env()}.exs" diff --git a/config/test.exs b/config/test.exs index 8a66a21..9e004ad 100644 --- a/config/test.exs +++ b/config/test.exs @@ -1,4 +1,3 @@ use Mix.Config -config :orangeade, - default_start_seed: ExUnit.configuration()[:seed] +config :orangeade, default_start_seed: ExUnit.configuration()[:seed] diff --git a/lib/orangeade.ex b/lib/orangeade.ex index 5dd6393..7c48e9c 100644 --- a/lib/orangeade.ex +++ b/lib/orangeade.ex @@ -24,6 +24,6 @@ defmodule Orangeade do end defp get_default_seed do - Application.get_env(:orangeade, :default_start_seed) + Application.get_env(:orangeade, :default_start_seed) end end diff --git a/test/orangeade/generator/big_natural_test.exs b/test/orangeade/generator/big_natural_test.exs index 89babd4..ef6958b 100644 --- a/test/orangeade/generator/big_natural_test.exs +++ b/test/orangeade/generator/big_natural_test.exs @@ -6,6 +6,7 @@ defmodule Orangeade.Generator.BigNaturalTest do list_of_elements = BigNatural.stream() |> Caffeine.Stream.take(10) + assert Enum.all?(list_of_elements, &is_natural/1) end