diff --git a/Assets/Scripts/Domain/Model.cs b/Assets/Scripts/Domain/Model.cs index 2c4da88..0ca7ba3 100644 --- a/Assets/Scripts/Domain/Model.cs +++ b/Assets/Scripts/Domain/Model.cs @@ -3,26 +3,31 @@ public int Score { private set; get; } public readonly int SpawnRate; - private bool _needsToSpawn; + public readonly int GrowIterations; - public Model(int spawnRate) : this(0, spawnRate) { } + public float GrowPercentage { private set; get; } - public Model(int score, int spawnRate) { + public bool NeedsToSpawn { private set; get; } + public bool NeedsToAnimate { private set; get; } + + public Model(int spawnRate, int growIterations) : this(0, spawnRate, growIterations) { } + + public Model(int score, int spawnRate, int growIterations) { Score = score; SpawnRate = spawnRate; + GrowIterations = growIterations; } public void AddScore() { Score++; - if (Score % SpawnRate == 0) - _needsToSpawn = true; - } + NeedsToAnimate = NeedsToSpawn = false; - public bool NeedsToSpawn() { - bool needs = _needsToSpawn; - _needsToSpawn = false; - - return needs; + if (Score % GrowIterations == 0) { + GrowPercentage = Score / (float)(SpawnRate * GrowIterations); + NeedsToAnimate = true; + } + if (Score % (SpawnRate * GrowIterations) == 0) + NeedsToSpawn = true; } } } \ No newline at end of file diff --git a/Assets/Scripts/Presenter/ExpressionClick.cs b/Assets/Scripts/Presenter/ExpressionClick.cs index 6b2dba9..24c08bd 100644 --- a/Assets/Scripts/Presenter/ExpressionClick.cs +++ b/Assets/Scripts/Presenter/ExpressionClick.cs @@ -16,7 +16,7 @@ namespace Presenter { _model.AddScore(); _view.UpdateView(_model.Score); - if (_model.NeedsToSpawn()) { + if (_model.NeedsToSpawn) { _spawner.SpawnRose(); } } diff --git a/Assets/Scripts/Tests/ModelTests.cs b/Assets/Scripts/Tests/ModelTests.cs new file mode 100644 index 0000000..afe1df4 --- /dev/null +++ b/Assets/Scripts/Tests/ModelTests.cs @@ -0,0 +1,93 @@ +using Domain; +using NUnit.Framework; + +namespace Tests { + public class ModelTests { + [Test] + public void NoPress_NoAnimation() { + Model sut = new(20, 5); + + Assert.IsFalse(sut.NeedsToAnimate); + } + + [Test] + public void NotEnoughPresses_NoAnimation() { + Model sut = new(20, 5); + + sut.AddScore(); + + Assert.IsFalse(sut.NeedsToAnimate); + } + + + [Test] + public void EnoughPresses_Animation() { + Model sut = new(20, 5); + + for (int i = 0; i < 5; i++) + sut.AddScore(); + + Assert.IsTrue(sut.NeedsToAnimate); + } + + [Test] + public void NoPress_NoSpawn() { + Model sut = new(20, 5); + + Assert.IsFalse(sut.NeedsToSpawn); + } + + [Test] + public void NotEnoughPresses_NoSpawn() { + Model sut = new(20, 5); + + sut.AddScore(); + + Assert.IsFalse(sut.NeedsToSpawn); + } + + [Test] + public void EnoughPresses_Spawn() { + Model sut = new(20, 5); + + for (int i = 0; i < 20 * 5; i++) { + sut.AddScore(); + } + + Assert.IsTrue(sut.NeedsToSpawn); + } + + [Test] + public void OneIteration_UpdatesGrowPercentage() { + Model sut = new(5, 5); + + for (int i = 0; i < 5; i++) { + sut.AddScore(); + } + + Assert.AreEqual(1f / 5f, sut.GrowPercentage); + } + + [Test] + public void AllIterations_GrowCompleted() { + Model sut = new(5, 5); + + for (int i = 0; i < 5 * 5; i++) { + sut.AddScore(); + } + + Assert.AreEqual(1f, sut.GrowPercentage); + } + + [Test] + public void MoreIterations_ResetsGrowPercentage() { + Model sut = new(5, 5); + + for (int i = 0; i < 6 * 5; i++) { + sut.AddScore(); + } + + Assert.AreEqual(1f / 5f, sut.GrowPercentage); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Tests/ModelTests.cs.meta b/Assets/Scripts/Tests/ModelTests.cs.meta new file mode 100644 index 0000000..2b507ba --- /dev/null +++ b/Assets/Scripts/Tests/ModelTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b81eb0f05b9b4ed38c6b881421132fdd +timeCreated: 1713269019 \ No newline at end of file diff --git a/Assets/Scripts/View/Dependencies.cs b/Assets/Scripts/View/Dependencies.cs index 46a0181..eb24ae0 100644 --- a/Assets/Scripts/View/Dependencies.cs +++ b/Assets/Scripts/View/Dependencies.cs @@ -11,7 +11,7 @@ namespace View { public CustomInput CustomInput { private set; get; } private void Awake() { - Model = new Model(20); + Model = new Model(20, 5); IExpressionInput input = FindObjectOfType(); IExpressionInput visibility = FindObjectOfType();