blob: 6519526d52b05421040f4ba32c8d988db4b2da12 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:test/test.dart';
import 'package:fidl/fidl.dart';
import 'package:fidl_fuchsia_modular/fidl_async.dart' as modular;
import 'package:fuchsia_modular_flutter/session_shell.dart';
import 'package:fuchsia_scenic_flutter/child_view_connection.dart';
import 'package:fuchsia_services/services.dart';
import 'package:mockito/mockito.dart';
// ignore: implementation_imports
import 'package:fuchsia_modular_flutter/src/session_shell/internal/_session_shell_impl.dart';
void main() {
test('Create SessionShell', () {
expect(
SessionShell(
startupContext: MockStartupContext(),
onStoryStarted: ({
modular.StoryInfo info,
SessionShell sessionShell,
modular.StoryController controller,
}) {
return TestStory()..info = info;
}),
isNotNull);
});
test('Start SessionShell', () {
final mockStartupContext = MockStartupContext();
final mockOutgoingImpl = MockOutgoing();
when(mockStartupContext.outgoing).thenReturn(mockOutgoingImpl);
TestSessionShell(startupContext: mockStartupContext).start();
verify(mockOutgoingImpl.addPublicService(
any, modular.SessionShell.$serviceName));
verify(mockOutgoingImpl.addPublicService(
any, modular.SessionShellPresentationProvider.$serviceName));
});
test('Story started', () {
String startedStoryId;
final sessionShell = TestSessionShell(onStoryStarted: ({
modular.StoryInfo info,
SessionShell sessionShell,
modular.StoryController controller,
}) {
startedStoryId = info.id;
return TestStory()..info = info;
})
..onChange(
modular.StoryInfo(id: 'foo', lastFocusTime: 0),
modular.StoryState.stopped,
modular.StoryVisibilityState.default$,
);
expect(startedStoryId, 'foo');
verify(sessionShell.mockStoryController.requestStart());
});
test('Story deleted', () {
String deletedStoryId;
TestSessionShell(onStoryDeleted: (story) {
deletedStoryId = story.id;
})
..onChange(
modular.StoryInfo(id: 'foo', lastFocusTime: 0),
modular.StoryState.stopped,
modular.StoryVisibilityState.default$,
)
..deleteStory('foo');
expect(deletedStoryId, 'foo');
});
test('Story changed', () {
Story changedStory;
TestSessionShell(onStoryChanged: (story) {
changedStory = story;
})
..onChange(
modular.StoryInfo(id: 'foo', lastFocusTime: 0),
modular.StoryState.stopped,
modular.StoryVisibilityState.default$,
)
..onChange(
modular.StoryInfo(id: 'foo', lastFocusTime: 0),
modular.StoryState.running,
modular.StoryVisibilityState.default$,
);
expect(changedStory.id, 'foo');
expect(changedStory.state, modular.StoryState.running);
});
test('Story focused', () {
Story changedStory;
TestSessionShell(onStoryChanged: (story) {
changedStory = story;
})
..onChange(
modular.StoryInfo(id: 'foo', lastFocusTime: 0),
modular.StoryState.stopped,
modular.StoryVisibilityState.default$,
)
..onFocusChange(modular.FocusInfo(
focusedStoryId: 'foo',
deviceId: '',
lastFocusChangeTimestamp: 0,
));
expect(changedStory.id, 'foo');
expect(changedStory.focused, true);
});
}
class TestSessionShell extends SessionShellImpl {
MockSessionShellContext mockSessionShellContext = MockSessionShellContext();
MockStoryProvider mockStoryProvider = MockStoryProvider();
MockPuppetMaster mockPuppetMaster = MockPuppetMaster();
MockStoryController mockStoryController = MockStoryController();
TestSessionShell({
StartupContext startupContext,
StoryFactory onStoryStarted = _onStoryStarted,
StoryCallback onStoryChanged,
StoryCallback onStoryDeleted,
}) : super(
startupContext: startupContext ?? MockStartupContext(),
onStoryStarted: onStoryStarted,
onStoryDeleted: onStoryDeleted,
onStoryChanged: onStoryChanged,
);
static Story _onStoryStarted({
modular.StoryInfo info,
SessionShell sessionShell,
modular.StoryController controller,
}) {
return TestStory()..info = info;
}
@override
modular.SessionShellContext get context => mockSessionShellContext;
@override
modular.StoryProvider get storyProvider => mockStoryProvider;
@override
modular.PuppetMaster get puppetMaster => mockPuppetMaster;
@override
modular.StoryControllerProxy newStoryController() {
final mockCtrl = MockAsyncProxyController<modular.StoryController>();
when(mockStoryController.ctrl).thenReturn(mockCtrl);
return mockStoryController;
}
@override
void watch(
modular.StoryProvider storyProvider,
modular.SessionShellContext context,
) {}
}
class TestStory implements Story {
@override
ChildViewConnection childViewConnection;
@override
bool focused;
@override
modular.StoryState state;
@override
modular.StoryVisibilityState visibilityState;
@override
void delete() {}
@override
void focus() {}
@override
String get id => info.id;
@override
modular.StoryInfo info;
@override
void stop() {}
}
// Mock classes.
class MockStartupContext extends Mock implements StartupContext {}
class MockOutgoing extends Mock implements Outgoing {}
class MockIncomping extends Mock implements Incoming {}
class MockSessionShellContext extends Mock
implements modular.SessionShellContext {}
class MockStoryProvider extends Mock implements modular.StoryProvider {}
class MockPuppetMaster extends Mock implements modular.PuppetMaster {}
class MockStoryController extends Mock implements modular.StoryControllerProxy {
}
class MockAsyncProxyController<T> extends Mock
implements AsyncProxyController<T> {}