Commit c613a85c authored by Hans Muller's avatar Hans Muller Committed by GitHub

Invalid Curve transform parameter should assert (#7340)

parent 1146587c
...@@ -16,7 +16,8 @@ abstract class Curve { ...@@ -16,7 +16,8 @@ abstract class Curve {
/// Returns the value of the curve at point `t`. /// Returns the value of the curve at point `t`.
/// ///
/// The value of `t` must be between 0.0 and 1.0, inclusive. /// The value of `t` must be between 0.0 and 1.0, inclusive. Subclasses should
/// assert that this is true.
double transform(double t); double transform(double t);
/// Returns a new curve that is the reversed inversion of this one. /// Returns a new curve that is the reversed inversion of this one.
...@@ -54,6 +55,7 @@ class SawTooth extends Curve { ...@@ -54,6 +55,7 @@ class SawTooth extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t == 1.0) if (t == 1.0)
return 1.0; return 1.0;
t *= count; t *= count;
...@@ -84,6 +86,7 @@ class Interval extends Curve { ...@@ -84,6 +86,7 @@ class Interval extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
assert(begin >= 0.0); assert(begin >= 0.0);
assert(begin <= 1.0); assert(begin <= 1.0);
assert(end >= 0.0); assert(end >= 0.0);
...@@ -119,6 +122,7 @@ class Threshold extends Curve { ...@@ -119,6 +122,7 @@ class Threshold extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
assert(threshold >= 0.0); assert(threshold >= 0.0);
assert(threshold <= 1.0); assert(threshold <= 1.0);
if (t == 0.0 || t == 1.0) if (t == 0.0 || t == 1.0)
...@@ -180,6 +184,7 @@ class Cubic extends Curve { ...@@ -180,6 +184,7 @@ class Cubic extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
double start = 0.0; double start = 0.0;
double end = 1.0; double end = 1.0;
while (true) { while (true) {
...@@ -235,6 +240,7 @@ class _DecelerateCurve extends Curve { ...@@ -235,6 +240,7 @@ class _DecelerateCurve extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
// Intended to match the behavior of: // Intended to match the behavior of:
// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/animation/DecelerateInterpolator.java // https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/animation/DecelerateInterpolator.java
// ...as of December 2016. // ...as of December 2016.
...@@ -268,6 +274,7 @@ class _BounceInCurve extends Curve { ...@@ -268,6 +274,7 @@ class _BounceInCurve extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
return 1.0 - _bounce(1.0 - t); return 1.0 - _bounce(1.0 - t);
} }
} }
...@@ -280,6 +287,7 @@ class _BounceOutCurve extends Curve { ...@@ -280,6 +287,7 @@ class _BounceOutCurve extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
return _bounce(t); return _bounce(t);
} }
} }
...@@ -292,6 +300,7 @@ class _BounceInOutCurve extends Curve { ...@@ -292,6 +300,7 @@ class _BounceInOutCurve extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t < 0.5) if (t < 0.5)
return (1.0 - _bounce(1.0 - t)) * 0.5; return (1.0 - _bounce(1.0 - t)) * 0.5;
else else
...@@ -314,6 +323,7 @@ class ElasticInCurve extends Curve { ...@@ -314,6 +323,7 @@ class ElasticInCurve extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
double s = period / 4.0; double s = period / 4.0;
t = t - 1.0; t = t - 1.0;
return -math.pow(2.0, 10.0 * t) * math.sin((t - s) * (math.PI * 2.0) / period); return -math.pow(2.0, 10.0 * t) * math.sin((t - s) * (math.PI * 2.0) / period);
...@@ -337,6 +347,7 @@ class ElasticOutCurve extends Curve { ...@@ -337,6 +347,7 @@ class ElasticOutCurve extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
double s = period / 4.0; double s = period / 4.0;
return math.pow(2.0, -10 * t) * math.sin((t - s) * (math.PI * 2.0) / period) + 1.0; return math.pow(2.0, -10 * t) * math.sin((t - s) * (math.PI * 2.0) / period) + 1.0;
} }
...@@ -359,6 +370,7 @@ class ElasticInOutCurve extends Curve { ...@@ -359,6 +370,7 @@ class ElasticInOutCurve extends Curve {
@override @override
double transform(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
double s = period / 4.0; double s = period / 4.0;
t = 2.0 * t - 1.0; t = 2.0 * t - 1.0;
if (t < 0.0) if (t < 0.0)
......
...@@ -103,4 +103,37 @@ void main() { ...@@ -103,4 +103,37 @@ void main() {
double d2 = Curves.decelerate.transform(1.0) - Curves.decelerate.transform(0.8); double d2 = Curves.decelerate.transform(1.0) - Curves.decelerate.transform(0.8);
expect(d2, lessThan(d1)); expect(d2, lessThan(d1));
}); });
test('Invalid transform parameter should assert', () {
expect(() => const SawTooth(2).transform(-0.0001), throws);
expect(() => const SawTooth(2).transform(1.0001), throws);
expect(() => const Interval(0.0, 1.0).transform(-0.0001), throws);
expect(() => const Interval(0.0, 1.0).transform(1.0001), throws);
expect(() => const Threshold(0.5).transform(-0.0001), throws);
expect(() => const Threshold(0.5).transform(1.0001), throws);
expect(() => const ElasticInCurve().transform(-0.0001), throws);
expect(() => const ElasticInCurve().transform(1.0001), throws);
expect(() => const ElasticOutCurve().transform(-0.0001), throws);
expect(() => const ElasticOutCurve().transform(1.0001), throws);
expect(() => const Cubic(0.42, 0.0, 0.58, 1.0).transform(-0.0001), throws);
expect(() => const Cubic(0.42, 0.0, 0.58, 1.0).transform(1.0001), throws);
expect(() => Curves.decelerate.transform(-0.0001), throws);
expect(() => Curves.decelerate.transform(1.0001), throws);
expect(() => Curves.bounceIn.transform(-0.0001), throws);
expect(() => Curves.bounceIn.transform(1.0001), throws);
expect(() => Curves.bounceOut.transform(-0.0001), throws);
expect(() => Curves.bounceOut.transform(1.0001), throws);
expect(() => Curves.bounceInOut.transform(-0.0001), throws);
expect(() => Curves.bounceInOut.transform(1.0001), throws);
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment