From 9b2bc019e4c53fa7439c706545ca33b2ffb2f5bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 3 Mar 2017 10:25:10 +0100 Subject: [PATCH] [apps/probability] Forbid impossible value in parameters and calculation parameters Change-Id: I47aae775dc031d5b78d6995ca63f49d537848cb1 --- apps/probability/calculation/calculation.h | 6 ++++++ .../calculation/finite_integral_calculation.cpp | 4 ++++ .../probability/calculation/finite_integral_calculation.h | 1 + .../probability/calculation/left_integral_calculation.cpp | 4 ++++ apps/probability/calculation/left_integral_calculation.h | 1 + .../calculation/right_integral_calculation.cpp | 4 ++++ apps/probability/calculation/right_integral_calculation.h | 1 + apps/probability/calculation_controller.cpp | 8 ++++++++ apps/probability/law/binomial_law.cpp | 2 +- 9 files changed, 30 insertions(+), 1 deletion(-) diff --git a/apps/probability/calculation/calculation.h b/apps/probability/calculation/calculation.h index 0ee4e2d54..30f73e62e 100644 --- a/apps/probability/calculation/calculation.h +++ b/apps/probability/calculation/calculation.h @@ -7,8 +7,14 @@ namespace Probability { class Calculation { public: + enum class Type : uint8_t{ + LeftIntegral, + RightIntegral, + FiniteIntegral + }; Calculation(); virtual ~Calculation() {}; + virtual Type type() = 0; void setLaw(Law * law); virtual int numberOfParameters() = 0; virtual const char * legendForParameterAtIndex(int index) = 0; diff --git a/apps/probability/calculation/finite_integral_calculation.cpp b/apps/probability/calculation/finite_integral_calculation.cpp index 08b940641..d698139fd 100644 --- a/apps/probability/calculation/finite_integral_calculation.cpp +++ b/apps/probability/calculation/finite_integral_calculation.cpp @@ -14,6 +14,10 @@ FiniteIntegralCalculation::FiniteIntegralCalculation() : compute(0); } +Calculation::Type FiniteIntegralCalculation::type() { + return Type::FiniteIntegral; +} + int FiniteIntegralCalculation::numberOfParameters() { return 3; } diff --git a/apps/probability/calculation/finite_integral_calculation.h b/apps/probability/calculation/finite_integral_calculation.h index a1cf3e13d..7f6f81da3 100644 --- a/apps/probability/calculation/finite_integral_calculation.h +++ b/apps/probability/calculation/finite_integral_calculation.h @@ -9,6 +9,7 @@ class FiniteIntegralCalculation : public Calculation { public: FiniteIntegralCalculation(); ~FiniteIntegralCalculation() override {}; + Type type() override; int numberOfParameters() override; const char * legendForParameterAtIndex(int index) override; void setParameterAtIndex(float f, int index) override; diff --git a/apps/probability/calculation/left_integral_calculation.cpp b/apps/probability/calculation/left_integral_calculation.cpp index fb3d5a53f..7a7f1e4e6 100644 --- a/apps/probability/calculation/left_integral_calculation.cpp +++ b/apps/probability/calculation/left_integral_calculation.cpp @@ -13,6 +13,10 @@ LeftIntegralCalculation::LeftIntegralCalculation() : compute(0); } +Calculation::Type LeftIntegralCalculation::type() { + return Type::LeftIntegral; +} + int LeftIntegralCalculation::numberOfParameters() { return 2; } diff --git a/apps/probability/calculation/left_integral_calculation.h b/apps/probability/calculation/left_integral_calculation.h index e4d401f6c..952a20f92 100644 --- a/apps/probability/calculation/left_integral_calculation.h +++ b/apps/probability/calculation/left_integral_calculation.h @@ -9,6 +9,7 @@ class LeftIntegralCalculation : public Calculation { public: LeftIntegralCalculation(); ~LeftIntegralCalculation() override {}; + Type type() override; int numberOfParameters() override; const char * legendForParameterAtIndex(int index) override; void setParameterAtIndex(float f, int index) override; diff --git a/apps/probability/calculation/right_integral_calculation.cpp b/apps/probability/calculation/right_integral_calculation.cpp index 2defaf1cf..216a543fc 100644 --- a/apps/probability/calculation/right_integral_calculation.cpp +++ b/apps/probability/calculation/right_integral_calculation.cpp @@ -13,6 +13,10 @@ RightIntegralCalculation::RightIntegralCalculation() : compute(0); } +Calculation::Type RightIntegralCalculation::type() { + return Type::RightIntegral; +} + int RightIntegralCalculation::numberOfParameters() { return 2; } diff --git a/apps/probability/calculation/right_integral_calculation.h b/apps/probability/calculation/right_integral_calculation.h index dfd2c83bb..4fc4d30ac 100644 --- a/apps/probability/calculation/right_integral_calculation.h +++ b/apps/probability/calculation/right_integral_calculation.h @@ -9,6 +9,7 @@ class RightIntegralCalculation : public Calculation { public: RightIntegralCalculation(); ~RightIntegralCalculation() override {}; + Type type() override; int numberOfParameters() override; const char * legendForParameterAtIndex(int index) override; void setParameterAtIndex(float f, int index) override; diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index 0cc2751e8..d545cc415 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -203,6 +203,14 @@ bool CalculationController::textFieldDidFinishEditing(TextField * textField, con App * probaApp = (App *)app(); Context * globalContext = probaApp->container()->globalContext(); float floatBody = Expression::parse(text)->approximate(*globalContext); + if (m_calculation->type() != Calculation::Type::FiniteIntegral && m_highlightedSubviewIndex == 2) { + if (floatBody < 0.0f) { + floatBody = 0.0f; + } + if (floatBody > 1.0f) { + floatBody = 1.0f; + } + } m_calculation->setParameterAtIndex(floatBody, m_highlightedSubviewIndex-1); for (int k = 0; k < m_calculation->numberOfParameters(); k++) { m_contentView.willDisplayEditableCellAtIndex(k); diff --git a/apps/probability/law/binomial_law.cpp b/apps/probability/law/binomial_law.cpp index 54aefae5d..f58538ba7 100644 --- a/apps/probability/law/binomial_law.cpp +++ b/apps/probability/law/binomial_law.cpp @@ -99,7 +99,7 @@ float BinomialLaw::evaluateAtAbscissa(float x) const { bool BinomialLaw::authorizedValueAtIndex(float x, int index) const { if (index == 0) { - if (x != (int)x) { + if (x != (int)x || x < 0) { return false; } return true;