@ -13,28 +13,54 @@ import '../helpers/helpers.dart';
void main ( ) {
void main ( ) {
TestWidgetsFlutterBinding . ensureInitialized ( ) ;
TestWidgetsFlutterBinding . ensureInitialized ( ) ;
final assets = [
final assets = [
Assets . images . dash . bumper . main . active . keyName ,
Assets . images . androidBumper . a . lit . keyName ,
Assets . images . dash . bumper . main . inactive . keyName ,
Assets . images . androidBumper . a . dimmed . keyName ,
Assets . images . androidBumper . b . lit . keyName ,
Assets . images . androidBumper . b . dimmed . keyName ,
Assets . images . backboard . backboardScores . keyName ,
Assets . images . backboard . backboardGameOver . keyName ,
Assets . images . backboard . display . keyName ,
Assets . images . ball . ball . keyName ,
Assets . images . ball . flameEffect . keyName ,
Assets . images . baseboard . left . keyName ,
Assets . images . baseboard . right . keyName ,
Assets . images . boundary . bottom . keyName ,
Assets . images . boundary . outer . keyName ,
Assets . images . boundary . outerBottom . keyName ,
Assets . images . chromeDino . mouth . keyName ,
Assets . images . chromeDino . head . keyName ,
Assets . images . dino . dinoLandTop . keyName ,
Assets . images . dino . dinoLandBottom . keyName ,
Assets . images . dash . animatronic . keyName ,
Assets . images . dash . bumper . a . active . keyName ,
Assets . images . dash . bumper . a . active . keyName ,
Assets . images . dash . bumper . a . inactive . keyName ,
Assets . images . dash . bumper . a . inactive . keyName ,
Assets . images . dash . bumper . b . active . keyName ,
Assets . images . dash . bumper . b . active . keyName ,
Assets . images . dash . bumper . b . inactive . keyName ,
Assets . images . dash . bumper . b . inactive . keyName ,
Assets . images . dash . animatronic . keyName ,
Assets . images . dash . bumper . main . active . keyName ,
Assets . images . dash . bumper . main . inactive . keyName ,
Assets . images . flipper . left . keyName ,
Assets . images . flipper . right . keyName ,
Assets . images . googleWord . letter1 . keyName ,
Assets . images . googleWord . letter2 . keyName ,
Assets . images . googleWord . letter3 . keyName ,
Assets . images . googleWord . letter4 . keyName ,
Assets . images . googleWord . letter5 . keyName ,
Assets . images . googleWord . letter6 . keyName ,
Assets . images . kicker . left . keyName ,
Assets . images . kicker . right . keyName ,
Assets . images . launchRamp . ramp . keyName ,
Assets . images . launchRamp . foregroundRailing . keyName ,
Assets . images . launchRamp . backgroundRailing . keyName ,
Assets . images . plunger . plunger . keyName ,
Assets . images . plunger . rocket . keyName ,
Assets . images . signpost . inactive . keyName ,
Assets . images . signpost . inactive . keyName ,
Assets . images . signpost . active1 . keyName ,
Assets . images . signpost . active1 . keyName ,
Assets . images . signpost . active2 . keyName ,
Assets . images . signpost . active2 . keyName ,
Assets . images . signpost . active3 . keyName ,
Assets . images . signpost . active3 . keyName ,
Assets . images . androidBumper . a . lit . keyName ,
Assets . images . slingshot . upper . keyName ,
Assets . images . androidBumper . a . dimmed . keyName ,
Assets . images . slingshot . lower . keyName ,
Assets . images . androidBumper . b . lit . keyName ,
Assets . images . spaceship . saucer . keyName ,
Assets . images . androidBumper . b . dimmed . keyName ,
Assets . images . spaceship . bridge . keyName ,
Assets . images . sparky . bumper . a . active . keyName ,
Assets . images . sparky . bumper . a . inactive . keyName ,
Assets . images . sparky . bumper . b . active . keyName ,
Assets . images . sparky . bumper . b . inactive . keyName ,
Assets . images . sparky . bumper . c . active . keyName ,
Assets . images . sparky . bumper . c . inactive . keyName ,
Assets . images . sparky . animatronic . keyName ,
Assets . images . spaceship . ramp . boardOpening . keyName ,
Assets . images . spaceship . ramp . boardOpening . keyName ,
Assets . images . spaceship . ramp . railingForeground . keyName ,
Assets . images . spaceship . ramp . railingForeground . keyName ,
Assets . images . spaceship . ramp . railingBackground . keyName ,
Assets . images . spaceship . ramp . railingBackground . keyName ,
@ -45,18 +71,26 @@ void main() {
Assets . images . spaceship . ramp . arrow . active3 . keyName ,
Assets . images . spaceship . ramp . arrow . active3 . keyName ,
Assets . images . spaceship . ramp . arrow . active4 . keyName ,
Assets . images . spaceship . ramp . arrow . active4 . keyName ,
Assets . images . spaceship . ramp . arrow . active5 . keyName ,
Assets . images . spaceship . ramp . arrow . active5 . keyName ,
Assets . images . baseboard . left . keyName ,
Assets . images . spaceship . rail . main . keyName ,
Assets . images . baseboard . right . keyName ,
Assets . images . spaceship . rail . foreground . keyName ,
Assets . images . flipper . left . keyName ,
Assets . images . sparky . bumper . a . active . keyName ,
Assets . images . flipper . right . keyName ,
Assets . images . sparky . bumper . a . inactive . keyName ,
Assets . images . boundary . outer . keyName ,
Assets . images . sparky . bumper . b . active . keyName ,
Assets . images . boundary . outerBottom . keyName ,
Assets . images . sparky . bumper . b . inactive . keyName ,
Assets . images . boundary . bottom . keyName ,
Assets . images . sparky . bumper . c . active . keyName ,
Assets . images . slingshot . upper . keyName ,
Assets . images . sparky . bumper . c . inactive . keyName ,
Assets . images . slingshot . lower . keyName ,
Assets . images . sparky . animatronic . keyName ,
Assets . images . dino . dinoLandTop . keyName ,
Assets . images . sparky . computer . top . keyName ,
Assets . images . dino . dinoLandBottom . keyName ,
Assets . images . sparky . computer . base . keyName ,
Assets . images . sparky . animatronic . keyName ,
Assets . images . sparky . bumper . a . inactive . keyName ,
Assets . images . sparky . bumper . a . active . keyName ,
Assets . images . sparky . bumper . b . active . keyName ,
Assets . images . sparky . bumper . b . inactive . keyName ,
Assets . images . sparky . bumper . c . active . keyName ,
Assets . images . sparky . bumper . c . inactive . keyName ,
] ;
] ;
final flameTester = FlameTester (
final flameTester = FlameTester (
( ) = > PinballTestGame ( assets: assets ) ,
( ) = > PinballTestGame ( assets: assets ) ,
) ;
) ;
@ -72,7 +106,6 @@ void main() {
' has only one BottomWall ' ,
' has only one BottomWall ' ,
( game ) async {
( game ) async {
await game . ready ( ) ;
await game . ready ( ) ;
expect (
expect (
game . children . whereType < BottomWall > ( ) . length ,
game . children . whereType < BottomWall > ( ) . length ,
equals ( 1 ) ,
equals ( 1 ) ,
@ -91,34 +124,34 @@ void main() {
} ,
} ,
) ;
) ;
flameTester . test ( ' has one Board ' , ( game ) async {
flameTester . test (
' has one Board ' ,
( game ) async {
await game . ready ( ) ;
await game . ready ( ) ;
expect (
expect (
game . children . whereType < Board > ( ) . length ,
game . children . whereType < Board > ( ) . length ,
equals ( 1 ) ,
equals ( 1 ) ,
) ;
) ;
} ) ;
} ,
) ;
group ( ' controller ' , ( ) {
/ / TODO ( alestiago ) : Write test to be controller agnostic .
group ( ' listenWhen ' , ( ) {
late GameBloc gameBloc ;
setUp ( ( ) {
gameBloc = GameBloc ( ) ;
} ) ;
final flameBlocTester = FlameBlocTester < PinballGame , GameBloc > (
flameTester . test (
gameBuilder: EmptyPinballTestGame . new ,
' one GoogleWord ' ,
blocBuilder: ( ) = > gameBloc ,
( game ) async {
/ / assets: assets ,
await game . ready ( ) ;
expect ( game . children . whereType < GoogleWord > ( ) . length , equals ( 1 ) ) ;
} ,
) ;
) ;
flameBlocTester . testGameWidget (
group ( ' controller ' , ( ) {
' listens when all balls are lost and there are more than 0 balls ' ,
group ( ' listenWhen ' , ( ) {
flameTester . testGameWidget (
' listens when all balls are lost and there are more than 0 rounds ' ,
setUp: ( game , tester ) async {
setUp: ( game , tester ) async {
/ / TODO ( ruimiguel ) : check why testGameWidget doesn ' t add any ball
/ / to the game . Test needs to have no balls , so fortunately works .
final newState = MockGameState ( ) ;
final newState = MockGameState ( ) ;
when ( ( ) = > newState . balls ) . thenReturn ( 2 ) ;
when ( ( ) = > newState . isGameOver) . thenReturn ( false ) ;
game . descendants ( ) . whereType < ControlledBall > ( ) . forEach (
game . descendants ( ) . whereType < ControlledBall > ( ) . forEach (
( ball ) = > ball . controller . lost ( ) ,
( ball ) = > ball . controller . lost ( ) ,
) ;
) ;
@ -135,10 +168,10 @@ void main() {
" doesn't listen when some balls are left " ,
" doesn't listen when some balls are left " ,
( game ) async {
( game ) async {
final newState = MockGameState ( ) ;
final newState = MockGameState ( ) ;
when ( ( ) = > newState . balls) . thenReturn ( 1 ) ;
when ( ( ) = > newState . isGameOver) . thenReturn ( false ) ;
expect (
expect (
game . descendants ( ) . whereType < Ball> ( ) . length ,
game . descendants ( ) . whereType < Controlled Ball> ( ) . length ,
greaterThan ( 0 ) ,
greaterThan ( 0 ) ,
) ;
) ;
expect (
expect (
@ -148,19 +181,20 @@ void main() {
} ,
} ,
) ;
) ;
flameBlocTester . test (
flameTester . testGameWidget (
" doesn't listen when no balls left " ,
" doesn't listen when game is over " ,
( game ) async {
setUp: ( game , tester ) async {
/ / TODO ( ruimiguel ) : check why testGameWidget doesn ' t add any ball
/ / to the game . Test needs to have no balls , so fortunately works .
final newState = MockGameState ( ) ;
final newState = MockGameState ( ) ;
when ( ( ) = > newState . balls ) . thenReturn ( 0 ) ;
when ( ( ) = > newState . isGameOver ) . thenReturn ( true ) ;
game . descendants ( ) . whereType < ControlledBall > ( ) . forEach (
game . descendants ( ) . whereType < ControlledBall > ( ) . forEach (
( ball ) = > ball . controller . lost ( ) ,
( ball ) = > ball . controller . lost ( ) ,
) ;
) ;
await game . ready ( ) ;
await game . ready ( ) ;
expect (
expect (
game . descendants ( ) . whereType < Ball> ( ) . isEmpty ,
game . descendants ( ) . whereType < Controlled Ball> ( ) . isEmpty ,
isTrue ,
isTrue ,
) ;
) ;
expect (
expect (
@ -177,14 +211,13 @@ void main() {
flameTester . test (
flameTester . test (
' spawns a ball ' ,
' spawns a ball ' ,
( game ) async {
( game ) async {
await game . ready ( ) ;
final previousBalls =
final previousBalls =
game . descendants ( ) . whereType < Ball> ( ) . toList ( ) ;
game . descendants ( ) . whereType < Controlled Ball> ( ) . toList ( ) ;
game . controller . onNewState ( MockGameState ( ) ) ;
game . controller . onNewState ( MockGameState ( ) ) ;
await game . ready ( ) ;
await game . ready ( ) ;
final currentBalls =
final currentBalls =
game . descendants ( ) . whereType < Ball> ( ) . toList ( ) ;
game . descendants ( ) . whereType < Controlled Ball> ( ) . toList ( ) ;
expect (
expect (
currentBalls . length ,
currentBalls . length ,
@ -199,57 +232,26 @@ void main() {
} ) ;
} ) ;
group ( ' DebugPinballGame ' , ( ) {
group ( ' DebugPinballGame ' , ( ) {
debugModeFlameTester . test ( ' adds a ball on tap up ' , ( game ) async {
debugModeFlameTester . test (
await game . ready ( ) ;
' adds a ball on tap up ' ,
( game ) async {
final eventPosition = MockEventPosition ( ) ;
final eventPosition = MockEventPosition ( ) ;
when ( ( ) = > eventPosition . game ) . thenReturn ( Vector2 . all ( 10 ) ) ;
when ( ( ) = > eventPosition . game ) . thenReturn ( Vector2 . all ( 10 ) ) ;
final tapUpEvent = MockTapUpInfo ( ) ;
final tapUpEvent = MockTapUpInfo ( ) ;
when ( ( ) = > tapUpEvent . eventPosition ) . thenReturn ( eventPosition ) ;
when ( ( ) = > tapUpEvent . eventPosition ) . thenReturn ( eventPosition ) ;
final previousBalls = game . descendants ( ) . whereType < Ball > ( ) . toList ( ) ;
final previousBalls =
game . descendants ( ) . whereType < ControlledBall > ( ) . toList ( ) ;
game . onTapUp ( tapUpEvent ) ;
game . onTapUp ( tapUpEvent ) ;
await game . ready ( ) ;
await game . ready ( ) ;
expect (
expect (
game . children . whereType < Ball> ( ) . length ,
game . children . whereType < Controlled Ball> ( ) . length ,
equals ( previousBalls . length + 1 ) ,
equals ( previousBalls . length + 1 ) ,
) ;
) ;
} ) ;
group ( ' controller ' , ( ) {
late GameBloc gameBloc ;
setUp ( ( ) {
gameBloc = GameBloc ( ) ;
} ) ;
final debugModeFlameBlocTester =
FlameBlocTester < DebugPinballGame , GameBloc > (
gameBuilder: DebugPinballTestGame . new ,
blocBuilder: ( ) = > gameBloc ,
assets: assets ,
) ;
debugModeFlameBlocTester . testGameWidget (
' ignores debug balls ' ,
setUp: ( game , tester ) async {
final newState = MockGameState ( ) ;
when ( ( ) = > newState . balls ) . thenReturn ( 1 ) ;
await game . ready ( ) ;
game . children . removeWhere ( ( component ) = > component is Ball ) ;
await game . ready ( ) ;
await game . ensureAdd ( ControlledBall . debug ( ) ) ;
expect (
game . controller . listenWhen ( MockGameState ( ) , newState ) ,
isTrue ,
) ;
} ,
} ,
) ;
) ;
} ) ;
} ) ;
} ) ;
}
}