Skip to content

Commit

Permalink
test: Add smoke test for widgets and FlameGame
Browse files Browse the repository at this point in the history
  • Loading branch information
spydon committed Nov 8, 2023
1 parent 91b92e1 commit e3ab251
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import 'dart:async';

import 'package:endless_runner/flame_game/components/player.dart';

import 'persistence/local_storage_player_progress_persistence.dart';
import 'package:flutter/foundation.dart';

import 'persistence/player_progress_persistence.dart';

/// Encapsulates the player's progress.
class PlayerProgress extends ChangeNotifier {
PlayerProgress({PlayerProgressPersistence? store})
: _store = store ?? LocalStoragePlayerProgressPersistence() {
getLatestFromStore();
}

/// TODO: If needed, replace this with some other mechanism for saving
/// the player's progress. Currently, this uses the local storage
/// (i.e. NSUserDefaults on iOS, SharedPreferences on Android
/// or local storage on the web).
final PlayerProgressPersistence _store =
LocalStoragePlayerProgressPersistence();
final PlayerProgressPersistence _store;

List<int> _levelsFinished = [];

/// Creates an instance of [PlayerProgress] backed by an injected
/// persistence [store].
PlayerProgress() {
getLatestFromStore();
}

/// The times for the levels that the player has finished so far.
List<int> get levels => _levelsFinished;

Expand Down
9 changes: 5 additions & 4 deletions templates/endless_runner/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,23 @@ environment:
sdk: ^3.0.0

dependencies:
flame: ^1.10.0
flame: ^1.10.1
flutter:
sdk: flutter

audioplayers: ^5.2.0
cupertino_icons: ^1.0.6
flame_audio: ^2.1.2
go_router: ^12.0.1
flame_audio: ^2.1.3
go_router: ^12.1.0
provider: ^6.0.5
shared_preferences: ^2.2.2
nes_ui: ^0.10.0
google_fonts: ^6.1.0
logging: ^1.2.0

dev_dependencies:
flutter_lints: ^3.0.0
flame_test: ^1.14.0
flutter_lints: ^3.0.1
flutter_test:
sdk: flutter
flutter_launcher_icons: ^0.13.1
Expand Down
95 changes: 95 additions & 0 deletions templates/endless_runner/test/smoke_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import 'package:endless_runner/app_lifecycle/app_lifecycle.dart';
import 'package:endless_runner/audio/audio_controller.dart';
import 'package:endless_runner/audio/sounds.dart';
import 'package:endless_runner/flame_game/endless_runner.dart';
import 'package:endless_runner/flame_game/game_screen.dart';
import 'package:endless_runner/player_progress/persistence/memory_player_progress_persistence.dart';
import 'package:endless_runner/player_progress/player_progress.dart';
import 'package:endless_runner/settings/settings.dart';
import 'package:flame_test/flame_test.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:endless_runner/main.dart';
import 'package:go_router/go_router.dart';
import 'package:nes_ui/nes_ui.dart';

void main() {
testWidgets('smoke test menus', (tester) async {
// Build our game and trigger a frame.
await tester.pumpWidget(const MyGame());

// Verify that the 'Play' button is shown.
expect(find.text('Play'), findsOneWidget);

// Verify that the 'Settings' button is shown.
expect(find.text('Settings'), findsOneWidget);

// Go to 'Settings'.
await tester.tap(find.text('Settings'));
await tester.pumpAndSettle();
expect(find.text('Music'), findsOneWidget);

// Go back to main menu.
await tester.tap(find.text('Back'));
await tester.pumpAndSettle();

// Tap 'Play'.
await tester.tap(find.text('Play'));
await tester.pumpAndSettle();
expect(find.text('Select level'), findsOneWidget);

// Tap level 1.
await tester.tap(find.text('Level #1'));
await tester.pump();
});

testWithGame(
'smoke test flame game',
() {
return EndlessRunner(
level: (
number: 1,
winScore: 3,
canSpawnTall: false,
),
playerProgress: PlayerProgress(
store: MemoryOnlyPlayerProgressPersistence(),
),
audioController: _MockAudioController(),
);
},
(game) async {
game.overlays.addEntry(GameScreen.backButtonKey, (context, game) {
return Positioned(
top: 20,
right: 10,
child: NesButton(
type: NesButtonType.normal,
onPressed: GoRouter.of(context).pop,
child: NesIcon(iconData: NesIcons.leftArrowIndicator),
),
);
});
game.overlays.addEntry(
GameScreen.winDialogKey,
(context, game) => Container(),
);
await game.ready();
expect(game.children.length, 3);
expect(game.world.children.length, 3);
expect(game.camera.viewport.children.length, 1);
},
);
}

class _MockAudioController implements AudioController {
@override
void attachDependencies(AppLifecycleStateNotifier lifecycleNotifier,
SettingsController settingsController) {}

@override
void dispose() {}

@override
void playSfx(SfxType type) {}
}

0 comments on commit e3ab251

Please sign in to comment.