| // Copyright 2023 The Flutter Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. | |
| import 'package:devtools_extensions/api.dart'; | |
| import 'package:flutter_test/flutter_test.dart'; | |
| void main() { | |
| group('$DevToolsExtensionEvent', () { | |
| test('parse', () { | |
| var event = DevToolsExtensionEvent.parse({ | |
| 'type': 'ping', | |
| 'data': {'foo': 'bar'}, | |
| }); | |
| expect(event.type, DevToolsExtensionEventType.ping); | |
| expect(event.data, {'foo': 'bar'}); | |
| event = DevToolsExtensionEvent.parse({ | |
| 'type': 'pong', | |
| 'data': {'baz': 'bob'}, | |
| }); | |
| expect(event.type, DevToolsExtensionEventType.pong); | |
| expect(event.data, {'baz': 'bob'}); | |
| event = DevToolsExtensionEvent.parse({'type': 'idk'}); | |
| expect(event.type, DevToolsExtensionEventType.unknown); | |
| expect(event.data, isNull); | |
| }); | |
| test('tryParse', () { | |
| var event = DevToolsExtensionEvent.tryParse({ | |
| 'type': 'ping', | |
| 'data': {'foo': 'bar'}, | |
| }); | |
| expect(event, isNotNull); | |
| event = DevToolsExtensionEvent.tryParse('bad input'); | |
| expect(event, isNull); | |
| event = DevToolsExtensionEvent.tryParse({'more', 'bad', 'input'}); | |
| expect(event, isNull); | |
| event = DevToolsExtensionEvent.tryParse({1: 'bad', 2: 'input'}); | |
| expect(event, isNull); | |
| }); | |
| test('toJson', () { | |
| var event = DevToolsExtensionEvent(DevToolsExtensionEventType.ping); | |
| expect(event.toJson(), {'type': 'ping'}); | |
| event = DevToolsExtensionEvent( | |
| DevToolsExtensionEventType.pong, | |
| data: {'foo': 'bar'}, | |
| ); | |
| expect(event.toJson(), { | |
| 'type': 'pong', | |
| 'data': {'foo': 'bar'}, | |
| }); | |
| event = DevToolsExtensionEvent( | |
| DevToolsExtensionEventType.unknown, | |
| data: {'foo': 'bar'}, | |
| ); | |
| expect(event.toJson(), { | |
| 'type': 'unknown', | |
| 'data': {'foo': 'bar'}, | |
| }); | |
| }); | |
| }); | |
| group('$DevToolsExtensionEventType', () { | |
| test('parses for expected values', () { | |
| expect( | |
| DevToolsExtensionEventType.from('ping'), | |
| DevToolsExtensionEventType.ping, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('pong'), | |
| DevToolsExtensionEventType.pong, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('forceReload'), | |
| DevToolsExtensionEventType.forceReload, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('showNotification'), | |
| DevToolsExtensionEventType.showNotification, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('showBannerMessage'), | |
| DevToolsExtensionEventType.showBannerMessage, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('copyToClipboard'), | |
| DevToolsExtensionEventType.copyToClipboard, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('vmServiceConnection'), | |
| DevToolsExtensionEventType.vmServiceConnection, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('themeUpdate'), | |
| DevToolsExtensionEventType.themeUpdate, | |
| ); | |
| }); | |
| test('parses for unexpected values', () { | |
| expect( | |
| DevToolsExtensionEventType.from('PING'), | |
| DevToolsExtensionEventType.unknown, | |
| ); | |
| expect( | |
| DevToolsExtensionEventType.from('pongg'), | |
| DevToolsExtensionEventType.unknown, | |
| ); | |
| }); | |
| test('supportedForDirection', () { | |
| verifyEventDirection(DevToolsExtensionEventType.ping, ( | |
| bidirectional: false, | |
| toDevTools: false, | |
| toExtension: true, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.pong, ( | |
| bidirectional: false, | |
| toDevTools: true, | |
| toExtension: false, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.forceReload, ( | |
| bidirectional: false, | |
| toDevTools: false, | |
| toExtension: true, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.vmServiceConnection, ( | |
| bidirectional: true, | |
| toDevTools: true, | |
| toExtension: true, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.themeUpdate, ( | |
| bidirectional: false, | |
| toDevTools: false, | |
| toExtension: true, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.showNotification, ( | |
| bidirectional: false, | |
| toDevTools: true, | |
| toExtension: false, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.showBannerMessage, ( | |
| bidirectional: false, | |
| toDevTools: true, | |
| toExtension: false, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.copyToClipboard, ( | |
| bidirectional: false, | |
| toDevTools: true, | |
| toExtension: false, | |
| )); | |
| verifyEventDirection(DevToolsExtensionEventType.unknown, ( | |
| bidirectional: true, | |
| toDevTools: true, | |
| toExtension: true, | |
| )); | |
| }); | |
| }); | |
| group('$ShowNotificationExtensionEvent', () { | |
| test('constructs for expected values', () { | |
| final event = DevToolsExtensionEvent.parse({ | |
| 'type': 'showNotification', | |
| 'data': {'message': 'foo message'}, | |
| }); | |
| final showNotificationEvent = ShowNotificationExtensionEvent.from(event); | |
| expect(showNotificationEvent.message, 'foo message'); | |
| }); | |
| test('throws for unexpected values', () { | |
| final event1 = DevToolsExtensionEvent.parse({ | |
| 'type': 'showNotification', | |
| 'data': { | |
| // Missing required fields. | |
| }, | |
| }); | |
| expect(() { | |
| ShowNotificationExtensionEvent.from(event1); | |
| }, throwsFormatException); | |
| final event2 = DevToolsExtensionEvent.parse({ | |
| 'type': 'showNotification', | |
| 'data': { | |
| // Bad key. | |
| 'msg': 'foo message', | |
| }, | |
| }); | |
| expect(() { | |
| ShowNotificationExtensionEvent.from(event2); | |
| }, throwsFormatException); | |
| final event3 = DevToolsExtensionEvent.parse({ | |
| 'type': 'showNotification', | |
| 'data': { | |
| // Bad value. | |
| 'message': false, | |
| }, | |
| }); | |
| expect(() { | |
| ShowNotificationExtensionEvent.from(event3); | |
| }, throwsFormatException); | |
| final event4 = DevToolsExtensionEvent.parse({ | |
| // Wrong type. | |
| 'type': 'showBannerMessage', | |
| 'data': {'message': 'foo message'}, | |
| }); | |
| expect(() { | |
| ShowNotificationExtensionEvent.from(event4); | |
| }, throwsAssertionError); | |
| }); | |
| }); | |
| group('$ShowBannerMessageExtensionEvent', () { | |
| test('constructs for expected values', () { | |
| var event = DevToolsExtensionEvent.parse({ | |
| 'type': 'showBannerMessage', | |
| 'data': { | |
| 'id': 'fooMessageId', | |
| 'message': 'foo message', | |
| 'bannerMessageType': 'warning', | |
| 'extensionName': 'foo', | |
| }, | |
| }); | |
| var showBannerMessageEvent = ShowBannerMessageExtensionEvent.from(event); | |
| expect(showBannerMessageEvent.messageId, 'fooMessageId'); | |
| expect(showBannerMessageEvent.message, 'foo message'); | |
| expect(showBannerMessageEvent.bannerMessageType, 'warning'); | |
| expect(showBannerMessageEvent.extensionName, 'foo'); | |
| expect(showBannerMessageEvent.ignoreIfAlreadyDismissed, true); | |
| event = DevToolsExtensionEvent.parse({ | |
| 'type': 'showBannerMessage', | |
| 'data': { | |
| 'id': 'blah', | |
| 'message': 'blah message', | |
| 'bannerMessageType': 'error', | |
| 'extensionName': 'blah', | |
| 'ignoreIfAlreadyDismissed': false, | |
| }, | |
| }); | |
| showBannerMessageEvent = ShowBannerMessageExtensionEvent.from(event); | |
| expect(showBannerMessageEvent.messageId, 'blah'); | |
| expect(showBannerMessageEvent.message, 'blah message'); | |
| expect(showBannerMessageEvent.bannerMessageType, 'error'); | |
| expect(showBannerMessageEvent.extensionName, 'blah'); | |
| expect(showBannerMessageEvent.ignoreIfAlreadyDismissed, false); | |
| }); | |
| test('throws for unexpected values', () { | |
| final event1 = DevToolsExtensionEvent.parse({ | |
| 'type': 'showBannerMessage', | |
| 'data': { | |
| // Missing required fields. | |
| 'extensionName': 'foo', | |
| }, | |
| }); | |
| expect(() { | |
| ShowBannerMessageExtensionEvent.from(event1); | |
| }, throwsFormatException); | |
| final event2 = DevToolsExtensionEvent.parse({ | |
| 'type': 'showBannerMessage', | |
| 'data': { | |
| // Bad keys. | |
| 'bad_key': 'fooMessageId', | |
| 'messages': 'foo message', | |
| 'bannerMessageTypeee': 'warning', | |
| 'extension_name': 'foo', | |
| }, | |
| }); | |
| expect(() { | |
| ShowBannerMessageExtensionEvent.from(event2); | |
| }, throwsFormatException); | |
| final event3 = DevToolsExtensionEvent.parse({ | |
| 'type': 'showBannerMessage', | |
| 'data': { | |
| // Bad values. | |
| 'id': 1, | |
| 'message': 'foo message', | |
| 'bannerMessageType': 2.0, | |
| 'extensionName': 'foo', | |
| }, | |
| }); | |
| expect(() { | |
| ShowBannerMessageExtensionEvent.from(event3); | |
| }, throwsFormatException); | |
| final event4 = DevToolsExtensionEvent.parse({ | |
| // Wrong type. | |
| 'type': 'showNotification', | |
| 'data': { | |
| 'id': 'fooMessageId', | |
| 'message': 'foo message', | |
| 'bannerMessageType': 'warning', | |
| 'extensionName': 'foo', | |
| }, | |
| }); | |
| expect(() { | |
| ShowBannerMessageExtensionEvent.from(event4); | |
| }, throwsAssertionError); | |
| }); | |
| }); | |
| group('$CopyToClipboardExtensionEvent', () { | |
| test('constructs for expected values', () { | |
| final event = DevToolsExtensionEvent.parse({ | |
| 'type': 'copyToClipboard', | |
| 'data': {'content': 'foo content', 'successMessage': 'foo success'}, | |
| }); | |
| final copyToClipboardEvent = CopyToClipboardExtensionEvent.from(event); | |
| expect(copyToClipboardEvent.content, 'foo content'); | |
| expect(copyToClipboardEvent.successMessage, 'foo success'); | |
| }); | |
| test('throws for unexpected values', () { | |
| final event1 = DevToolsExtensionEvent.parse({ | |
| 'type': 'copyToClipboard', | |
| 'data': { | |
| // Missing required fields. | |
| }, | |
| }); | |
| expect(() { | |
| CopyToClipboardExtensionEvent.from(event1); | |
| }, throwsFormatException); | |
| final event2 = DevToolsExtensionEvent.parse({ | |
| 'type': 'copyToClipboard', | |
| 'data': { | |
| // Bad key. | |
| 'msg': 'foo content', | |
| 'successMessage': 'foo success', | |
| }, | |
| }); | |
| expect(() { | |
| CopyToClipboardExtensionEvent.from(event2); | |
| }, throwsFormatException); | |
| final event3 = DevToolsExtensionEvent.parse({ | |
| 'type': 'copyToClipboard', | |
| 'data': { | |
| // Bad value. | |
| 'content': false, | |
| 'successMessage': 'foo success', | |
| }, | |
| }); | |
| expect(() { | |
| CopyToClipboardExtensionEvent.from(event3); | |
| }, throwsFormatException); | |
| final event4 = DevToolsExtensionEvent.parse({ | |
| // Wrong type. | |
| 'type': 'showBannerMessage', | |
| 'data': {'content': 'foo content', 'successMessage': 'foo success'}, | |
| }); | |
| expect(() { | |
| CopyToClipboardExtensionEvent.from(event4); | |
| }, throwsAssertionError); | |
| }); | |
| }); | |
| } | |
| void verifyEventDirection( | |
| DevToolsExtensionEventType type, | |
| ({bool bidirectional, bool toDevTools, bool toExtension}) expected, | |
| ) { | |
| expect( | |
| type.supportedForDirection(ExtensionEventDirection.bidirectional), | |
| expected.bidirectional, | |
| ); | |
| expect( | |
| type.supportedForDirection(ExtensionEventDirection.toDevTools), | |
| expected.toDevTools, | |
| ); | |
| expect( | |
| type.supportedForDirection(ExtensionEventDirection.toExtension), | |
| expected.toExtension, | |
| ); | |
| } |