Duration can not be zero

This commit is contained in:
Lukas Klingsbo
2020-11-01 21:19:15 +01:00
parent 09adb4972c
commit d77c8d9c79
6 changed files with 35 additions and 63 deletions

View File

@ -29,7 +29,7 @@ class MyGame extends BaseGame with TapDetector {
speed: 250.0, speed: 250.0,
curve: Curves.bounceInOut, curve: Curves.bounceInOut,
isRelative: false, isRelative: false,
isInfinite: true, isInfinite: false,
isAlternating: true, isAlternating: true,
)); ));
} }

View File

@ -1,5 +1,3 @@
import 'dart:math';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -60,7 +58,7 @@ abstract class ComponentEffect<T extends Component> {
} }
if (!hasFinished()) { if (!hasFinished()) {
currentTime += (dt + driftTime) * curveDirection; currentTime += (dt + driftTime) * curveDirection;
currentTime = (currentTime * 10000000).round() / 10000000; currentTime = (currentTime * 10000000).floor() / 10000000;
percentage = (currentTime / peakTime).clamp(0.0, 1.0).toDouble(); percentage = (currentTime / peakTime).clamp(0.0, 1.0).toDouble();
curveProgress = curve.transform(percentage); curveProgress = curve.transform(percentage);
_updateDriftTime(); _updateDriftTime();

View File

@ -41,8 +41,6 @@ void effectTest(
game.update(stepDelta); game.update(stepDelta);
timeLeft -= stepDelta; timeLeft -= stepDelta;
} }
expect(effect.hasFinished(), shouldFinish, reason: "Effect shouldFinish");
expect(callback.isCalled, shouldFinish, reason: "Callback was treated wrong");
if (!shouldFinish) { if (!shouldFinish) {
const double floatRange = 0.001; const double floatRange = 0.001;
bool acceptableVector(Vector2 vector, Vector2 expectedVector) { bool acceptableVector(Vector2 vector, Vector2 expectedVector) {
@ -56,18 +54,18 @@ void effectTest(
(expectedAngle - component.angle).abs() < floatRange; (expectedAngle - component.angle).abs() < floatRange;
assert( assert(
acceptablePosition, acceptablePosition,
"Position is not correct (${component.position} vs $expectedPosition)", "Position is not correct (had: ${component.position} should be $expectedPosition)",
); );
assert( assert(
acceptableAngle, acceptableAngle,
"Angle is not correct (${component.angle} vs $expectedAngle)", "Angle is not correct (had: ${component.angle} should be: $expectedAngle)",
); );
assert( assert(
acceptableSize, acceptableSize,
"Size is not correct (${component.size} vs $expectedSize)", "Size is not correct (had: ${component.size} should be: $expectedSize)",
); );
} else { } else {
//game.update(0.1); game.update(0.1);
expect( expect(
component.position, component.position,
expectedPosition, expectedPosition,
@ -84,12 +82,14 @@ void effectTest(
reason: "Size is not exactly correct", reason: "Size is not exactly correct",
); );
} }
expect(effect.hasFinished(), shouldFinish, reason: "Effect shouldFinish");
expect(callback.isCalled, shouldFinish, reason: "Callback was treated wrong");
game.update(0.0); // Since effects are removed before they are updated game.update(0.0); // Since effects are removed before they are updated
expect(component.effects.isEmpty, shouldFinish); expect(component.effects.isEmpty, shouldFinish);
} }
class Square extends PositionComponent { class TestComponent extends PositionComponent {
Square({ TestComponent({
Vector2 position, Vector2 position,
Vector2 size, Vector2 size,
double angle, double angle,

View File

@ -11,23 +11,22 @@ void main() {
final Random random = Random(); final Random random = Random();
Vector2 randomVector2() => (Vector2.random(random) * 100)..round(); Vector2 randomVector2() => (Vector2.random(random) * 100)..round();
final List<Vector2> path = List.generate(3, (i) => randomVector2()); final List<Vector2> path = List.generate(3, (i) => randomVector2());
Square component() => Square(position: randomVector2()); TestComponent component() => TestComponent(position: randomVector2());
MoveEffect effect(bool isInfinite, bool isAlternating) { MoveEffect effect(bool isInfinite, bool isAlternating) {
return MoveEffect( return MoveEffect(
path: path, path: path,
duration: random.nextInt(100).toDouble(), duration: 1 + random.nextInt(100).toDouble(),
isInfinite: isInfinite, isInfinite: isInfinite,
isAlternating: isAlternating, isAlternating: isAlternating,
); );
} }
testWidgets('MoveEffect can move', (WidgetTester tester) async { testWidgets('MoveEffect can move', (WidgetTester tester) async {
final MoveEffect moveEffect = effect(false, false);
effectTest( effectTest(
tester, tester,
component(), component(),
moveEffect, effect(false, false),
expectedPosition: path.last, expectedPosition: path.last,
); );
}); });
@ -35,11 +34,10 @@ void main() {
testWidgets( testWidgets(
'MoveEffect will stop moving after it is done', 'MoveEffect will stop moving after it is done',
(WidgetTester tester) async { (WidgetTester tester) async {
final MoveEffect moveEffect = effect(false, false);
effectTest( effectTest(
tester, tester,
component(), component(),
moveEffect, effect(false, false),
expectedPosition: path.last, expectedPosition: path.last,
iterations: 1.5, iterations: 1.5,
); );
@ -47,12 +45,11 @@ void main() {
); );
testWidgets('MoveEffect can alternate', (WidgetTester tester) async { testWidgets('MoveEffect can alternate', (WidgetTester tester) async {
final MoveEffect moveEffect = effect(false, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
moveEffect, effect(false, true),
expectedPosition: positionComponent.position.clone(), expectedPosition: positionComponent.position.clone(),
); );
}); });
@ -60,12 +57,11 @@ void main() {
testWidgets( testWidgets(
'MoveEffect can alternate and be infinite', 'MoveEffect can alternate and be infinite',
(WidgetTester tester) async { (WidgetTester tester) async {
final MoveEffect moveEffect = effect(true, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
moveEffect, effect(true, true),
expectedPosition: positionComponent.position.clone(), expectedPosition: positionComponent.position.clone(),
iterations: 1.0, iterations: 1.0,
shouldFinish: false, shouldFinish: false,
@ -74,12 +70,11 @@ void main() {
); );
testWidgets('MoveEffect alternation can peak', (WidgetTester tester) async { testWidgets('MoveEffect alternation can peak', (WidgetTester tester) async {
final MoveEffect moveEffect = effect(false, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
moveEffect, effect(false, true),
expectedPosition: path.last, expectedPosition: path.last,
shouldFinish: false, shouldFinish: false,
iterations: 0.5, iterations: 0.5,
@ -87,12 +82,11 @@ void main() {
}); });
testWidgets('MoveEffect can be infinite', (WidgetTester tester) async { testWidgets('MoveEffect can be infinite', (WidgetTester tester) async {
final MoveEffect moveEffect = effect(true, false);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
moveEffect, effect(true, false),
expectedPosition: path.last, expectedPosition: path.last,
iterations: 3.0, iterations: 3.0,
shouldFinish: false, shouldFinish: false,

View File

@ -7,32 +7,23 @@ import 'package:flutter_test/flutter_test.dart';
import 'effect_test_utils.dart'; import 'effect_test_utils.dart';
void main() { void main() {
final Random random = Random(); const double angleArgument = 6.0;
double roundDouble(double value, int places) { TestComponent component() => TestComponent(angle: 0.5);
final double mod = pow(10.0, places).toDouble();
return (value * mod).round().toDouble() / mod;
}
// Max three rotations
double randomAngle() => roundDouble(random.nextDouble() * 6 * pi, 2);
final double angleArgument = randomAngle();
Square component() => Square(angle: randomAngle());
RotateEffect effect(bool isInfinite, bool isAlternating) { RotateEffect effect(bool isInfinite, bool isAlternating) {
return RotateEffect( return RotateEffect(
angle: angleArgument, angle: angleArgument,
duration: random.nextInt(100).toDouble(), duration: 1 + random.nextInt(100).toDouble(),
isInfinite: isInfinite, isInfinite: isInfinite,
isAlternating: isAlternating, isAlternating: isAlternating,
); );
} }
testWidgets('RotateEffect can rotate', (WidgetTester tester) async { testWidgets('RotateEffect can rotate', (WidgetTester tester) async {
final RotateEffect rotateEffect = effect(false, false);
effectTest( effectTest(
tester, tester,
component(), component(),
rotateEffect, effect(false, false),
expectedAngle: angleArgument, expectedAngle: angleArgument,
); );
}); });
@ -40,11 +31,10 @@ void main() {
testWidgets( testWidgets(
'RotateEffect will stop rotating after it is done', 'RotateEffect will stop rotating after it is done',
(WidgetTester tester) async { (WidgetTester tester) async {
final RotateEffect rotateEffect = effect(false, false);
effectTest( effectTest(
tester, tester,
component(), component(),
rotateEffect, effect(false, false),
expectedAngle: angleArgument, expectedAngle: angleArgument,
iterations: 1.5, iterations: 1.5,
); );
@ -52,12 +42,11 @@ void main() {
); );
testWidgets('RotateEffect can alternate', (WidgetTester tester) async { testWidgets('RotateEffect can alternate', (WidgetTester tester) async {
final RotateEffect rotateEffect = effect(false, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
rotateEffect, effect(false, true),
expectedAngle: positionComponent.angle, expectedAngle: positionComponent.angle,
); );
}); });
@ -65,12 +54,11 @@ void main() {
testWidgets( testWidgets(
'RotateEffect can alternate and be infinite', 'RotateEffect can alternate and be infinite',
(WidgetTester tester) async { (WidgetTester tester) async {
final RotateEffect rotateEffect = effect(true, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
rotateEffect, effect(true, true),
expectedAngle: positionComponent.angle, expectedAngle: positionComponent.angle,
iterations: 1.0, iterations: 1.0,
shouldFinish: false, shouldFinish: false,
@ -79,12 +67,11 @@ void main() {
); );
testWidgets('RotateEffect alternation can peak', (WidgetTester tester) async { testWidgets('RotateEffect alternation can peak', (WidgetTester tester) async {
final RotateEffect rotateEffect = effect(false, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
rotateEffect, effect(false, true),
expectedAngle: angleArgument, expectedAngle: angleArgument,
shouldFinish: false, shouldFinish: false,
iterations: 0.5, iterations: 0.5,
@ -92,12 +79,11 @@ void main() {
}); });
testWidgets('RotateEffect can be infinite', (WidgetTester tester) async { testWidgets('RotateEffect can be infinite', (WidgetTester tester) async {
final RotateEffect rotateEffect = effect(true, false);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
rotateEffect, effect(true, false),
expectedAngle: angleArgument, expectedAngle: angleArgument,
iterations: 3.0, iterations: 3.0,
shouldFinish: false, shouldFinish: false,

View File

@ -11,23 +11,22 @@ void main() {
final Random random = Random(); final Random random = Random();
Vector2 randomVector2() => (Vector2.random(random) * 100)..round(); Vector2 randomVector2() => (Vector2.random(random) * 100)..round();
final Vector2 argumentSize = randomVector2(); final Vector2 argumentSize = randomVector2();
Square component() => Square(size: randomVector2()); TestComponent component() => TestComponent(size: randomVector2());
ScaleEffect effect(bool isInfinite, bool isAlternating) { ScaleEffect effect(bool isInfinite, bool isAlternating) {
return ScaleEffect( return ScaleEffect(
size: argumentSize, size: argumentSize,
duration: random.nextInt(100).toDouble(), duration: 1 + random.nextInt(100).toDouble(),
isInfinite: isInfinite, isInfinite: isInfinite,
isAlternating: isAlternating, isAlternating: isAlternating,
); );
} }
testWidgets('ScaleEffect can scale', (WidgetTester tester) async { testWidgets('ScaleEffect can scale', (WidgetTester tester) async {
final ScaleEffect scaleEffect = effect(false, false);
effectTest( effectTest(
tester, tester,
component(), component(),
scaleEffect, effect(false, false),
expectedSize: argumentSize, expectedSize: argumentSize,
); );
}); });
@ -35,11 +34,10 @@ void main() {
testWidgets( testWidgets(
'ScaleEffect will stop scaling after it is done', 'ScaleEffect will stop scaling after it is done',
(WidgetTester tester) async { (WidgetTester tester) async {
final ScaleEffect scaleEffect = effect(false, false);
effectTest( effectTest(
tester, tester,
component(), component(),
scaleEffect, effect(false, false),
expectedSize: argumentSize, expectedSize: argumentSize,
iterations: 1.5, iterations: 1.5,
); );
@ -47,12 +45,11 @@ void main() {
); );
testWidgets('ScaleEffect can alternate', (WidgetTester tester) async { testWidgets('ScaleEffect can alternate', (WidgetTester tester) async {
final ScaleEffect scaleEffect = effect(false, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
scaleEffect, effect(false, true),
expectedSize: positionComponent.size.clone(), expectedSize: positionComponent.size.clone(),
); );
}); });
@ -60,12 +57,11 @@ void main() {
testWidgets( testWidgets(
'ScaleEffect can alternate and be infinite', 'ScaleEffect can alternate and be infinite',
(WidgetTester tester) async { (WidgetTester tester) async {
final ScaleEffect scaleEffect = effect(true, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
scaleEffect, effect(true, true),
expectedSize: positionComponent.size.clone(), expectedSize: positionComponent.size.clone(),
iterations: 1.0, iterations: 1.0,
shouldFinish: false, shouldFinish: false,
@ -74,12 +70,11 @@ void main() {
); );
testWidgets('ScaleEffect alternation can peak', (WidgetTester tester) async { testWidgets('ScaleEffect alternation can peak', (WidgetTester tester) async {
final ScaleEffect scaleEffect = effect(false, true);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
scaleEffect, effect(false, true),
expectedSize: argumentSize, expectedSize: argumentSize,
shouldFinish: false, shouldFinish: false,
iterations: 0.5, iterations: 0.5,
@ -87,12 +82,11 @@ void main() {
}); });
testWidgets('ScaleEffect can be infinite', (WidgetTester tester) async { testWidgets('ScaleEffect can be infinite', (WidgetTester tester) async {
final ScaleEffect scaleEffect = effect(true, false);
final PositionComponent positionComponent = component(); final PositionComponent positionComponent = component();
effectTest( effectTest(
tester, tester,
positionComponent, positionComponent,
scaleEffect, effect(true, false),
expectedSize: argumentSize, expectedSize: argumentSize,
iterations: 3.0, iterations: 3.0,
shouldFinish: false, shouldFinish: false,