// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file is hand-formatted.

import 'dart:typed_data';

import 'package:flutter_test/flutter_test.dart';
import 'package:rfw/formats.dart';

void main() {
  testWidgets('String example', (WidgetTester tester) async {
    final Uint8List bytes = encodeDataBlob('Hello');
    expect(bytes, <int>[ 0xFE, 0x52, 0x57, 0x44, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F ]);
    final Object value = decodeDataBlob(bytes);
    expect(value, isA<String>());
    expect(value, 'Hello');
  });

  testWidgets('Map example', (WidgetTester tester) async {
    final Uint8List bytes = encodeDataBlob(const <String, Object?>{ 'a': 15 });
    expect(bytes, <int>[
      0xFE, 0x52, 0x57, 0x44, 0x07, 0x01, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x0F,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    ]);
    final Object value = decodeDataBlob(bytes);
    expect(value, isA<DynamicMap>());
    expect(value, const <String, Object?>{ 'a': 15 });
  });

  testWidgets('Signature check in decoders', (WidgetTester tester) async {
    try {
      decodeDataBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x46, 0x57, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('File signature mismatch. Expected FE 52 57 44 but found FE 52 46 57.'));
    }
    try {
      decodeLibraryBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x57, 0x44, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('File signature mismatch. Expected FE 52 46 57 but found FE 52 57 44.'));
    }
  });

  testWidgets('Trailing byte check', (WidgetTester tester) async {
    try {
      decodeDataBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x57, 0x44, 0x00, 0x00 ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('Unexpected trailing bytes after value.'));
    }
    try {
      decodeLibraryBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('Unexpected trailing bytes after constructors.'));
    }
  });

  testWidgets('Incomplete files in signatures', (WidgetTester tester) async {
    try {
      decodeDataBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x57 ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('Could not read byte at offset 3: unexpected end of file.'));
    }
    try {
      decodeLibraryBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x46 ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('Could not read byte at offset 3: unexpected end of file.'));
    }
  });

  testWidgets('Incomplete files after signatures', (WidgetTester tester) async {
    try {
      decodeDataBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x57, 0x44 ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('Could not read byte at offset 4: unexpected end of file.'));
    }
    try {
      decodeLibraryBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x46, 0x57 ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('Could not read int64 at offset 4: unexpected end of file.'));
    }
  });

  testWidgets('Invalid value tag', (WidgetTester tester) async {
    try {
      decodeDataBlob(Uint8List.fromList(<int>[ 0xFE, 0x52, 0x57, 0x44, 0xCC ]));
      fail('did not throw exception');
    } on FormatException catch (e) {
      expect('$e', contains('Unrecognized data type 0xCC while decoding blob.'));
    }
  });

  testWidgets('Library encoder smoke test', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[]));
    expect(bytes, <int>[ 0xFE, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, isEmpty);
  });

  testWidgets('Library encoder: imports', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[Import(LibraryName(<String>['a']))], <WidgetDeclaration>[]));
    expect(bytes, <int>[
      0xFE, 0x52, 0x46, 0x57, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, hasLength(1));
    expect(value.imports.single.name, const LibraryName(<String>['a']));
    expect(value.widgets, isEmpty);
  });

  testWidgets('Doubles', (WidgetTester tester) async {
    final Uint8List bytes = encodeDataBlob(0.25);
    expect(bytes, <int>[ 0xFE, 0x52, 0x57, 0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x3F ]);
    final Object value = decodeDataBlob(bytes);
    expect(value, isA<double>());
    expect(value, 0.25);
  });

  testWidgets('Library decoder: invalid widget declaration root', (WidgetTester tester) async {
    final Uint8List bytes = Uint8List.fromList(<int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0xEF,
    ]);
    try {
      decodeLibraryBlob(bytes);
    } on FormatException catch (e) {
      expect('$e', contains('Unrecognized data type 0xEF while decoding widget declaration root.'));
    }
  });

  testWidgets('Library encoder: args references', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': <Object?>[ ArgsReference(<Object>['d', 5]) ] })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x64, 0x02, 0x05, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, hasLength(1));
    expect((value.widgets.first.root as ConstructorCall).arguments.keys, <Object?>['c']);
    expect((value.widgets.first.root as ConstructorCall).arguments['c'], hasLength(1));
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0], isA<ArgsReference>());
    expect((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as ArgsReference).parts, hasLength(2));
    expect((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as ArgsReference).parts[0], 'd');
    expect((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as ArgsReference).parts[1], 5);
  });

  testWidgets('Library encoder: invalid args references', (WidgetTester tester) async {
    try {
      encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
        WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': <Object?>[ ArgsReference(<Object>[false]) ] })),
      ]));
    } on StateError catch (e) {
      expect('$e', contains('Unexpected type bool while encoding blob.'));
    }
  });

  testWidgets('Library decoder: invalid args references', (WidgetTester tester) async {
    final Uint8List bytes = Uint8List.fromList(<int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0xAC,
    ]);
    try {
      decodeLibraryBlob(bytes);
    } on FormatException catch (e) {
      expect('$e', contains('Invalid reference type 0xAC while decoding blob.'));
    }
  });

  testWidgets('Library encoder: switches', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, Switch('b', <Object?, Object>{ null: 'c' })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62,
      0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x10, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x63,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<Switch>());
    expect((value.widgets.first.root as Switch).input, 'b');
    expect((value.widgets.first.root as Switch).outputs, hasLength(1));
    expect((value.widgets.first.root as Switch).outputs.keys, <Object?>[null]);
    expect((value.widgets.first.root as Switch).outputs[null], 'c');
  });

  testWidgets('Library encoder: switches', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, Switch('b', <Object?, Object>{ 'c': 'd' })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62,
      0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x63, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x64,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<Switch>());
    expect((value.widgets.first.root as Switch).input, 'b');
    expect((value.widgets.first.root as Switch).outputs, hasLength(1));
    expect((value.widgets.first.root as Switch).outputs.keys, <Object?>['c']);
    expect((value.widgets.first.root as Switch).outputs['c'], 'd');
  });

  testWidgets('Bools', (WidgetTester tester) async {
    final Uint8List bytes = encodeDataBlob(const <Object?>[ false, true ]);
    expect(bytes, <int>[
      0xFE, 0x52, 0x57, 0x44, 0x05, 0x02, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    ]);
    final Object value = decodeDataBlob(bytes);
    expect(value, isA<DynamicList>());
    expect(value, const <Object?>{ false, true });
  });

  testWidgets('Library encoder: loops', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': <Object?>[
        Loop(<Object?>[], ConstructorCall('d', <String, Object?>{ 'e': LoopReference(0, <Object>[]) })),
      ] })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, hasLength(1));
    expect((value.widgets.first.root as ConstructorCall).arguments.keys, <Object?>['c']);
    expect((value.widgets.first.root as ConstructorCall).arguments['c'], hasLength(1));
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0], isA<Loop>());
    expect((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as Loop).input, isEmpty);
    expect((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as Loop).output, isA<ConstructorCall>());
    expect(((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as Loop).output as ConstructorCall).name, 'd');
    expect(((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as Loop).output as ConstructorCall).arguments, hasLength(1));
    expect(((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as Loop).output as ConstructorCall).arguments['e'], isA<LoopReference>());
    expect((((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as Loop).output as ConstructorCall).arguments['e']! as LoopReference).loop, 0);
    expect((((((value.widgets.first.root as ConstructorCall).arguments['c']! as DynamicList)[0]! as Loop).output as ConstructorCall).arguments['e']! as LoopReference).parts, isEmpty);
  });

  testWidgets('Library encoder: data references', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': DataReference(<Object>['d']) })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x64,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, hasLength(1));
    expect((value.widgets.first.root as ConstructorCall).arguments.keys, <Object?>['c']);
    expect((value.widgets.first.root as ConstructorCall).arguments['c'], isA<DataReference>());
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as DataReference).parts, const <Object>[ 'd' ]);
  });

  testWidgets('Library encoder: state references', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': StateReference(<Object>['d']) })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x64,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, hasLength(1));
    expect((value.widgets.first.root as ConstructorCall).arguments.keys, <Object?>['c']);
    expect((value.widgets.first.root as ConstructorCall).arguments['c'], isA<StateReference>());
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as StateReference).parts, const <Object>[ 'd' ]);
  });

  testWidgets('Library encoder: event handler', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': EventHandler('d', <String, Object?>{}) })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, hasLength(1));
    expect((value.widgets.first.root as ConstructorCall).arguments.keys, <Object?>['c']);
    expect((value.widgets.first.root as ConstructorCall).arguments['c'], isA<EventHandler>());
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as EventHandler).eventName, 'd');
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as EventHandler).eventArguments, isEmpty);
  });

  testWidgets('Library encoder: state setter', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': SetStateHandler(StateReference(<Object>['d']), false) })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x64, 0x00,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, hasLength(1));
    expect((value.widgets.first.root as ConstructorCall).arguments.keys, <Object?>['c']);
    expect((value.widgets.first.root as ConstructorCall).arguments['c'], isA<SetStateHandler>());
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as SetStateHandler).stateReference.parts, <Object>['d']);
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as SetStateHandler).value, false);
  });

  testWidgets('Library encoder: switch', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', null, ConstructorCall('b', <String, Object?>{ 'c': Switch(false, <Object?, Object>{} ) })),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
      0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, hasLength(1));
    expect((value.widgets.first.root as ConstructorCall).arguments.keys, <Object?>['c']);
    expect((value.widgets.first.root as ConstructorCall).arguments['c'], isA<Switch>());
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as Switch).input, false);
    expect(((value.widgets.first.root as ConstructorCall).arguments['c']! as Switch).outputs, isEmpty);
  });

  testWidgets('Library encoder: initial state', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', <String, Object?>{}, ConstructorCall('b', <String, Object?>{})),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNull);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'b');
    expect((value.widgets.first.root as ConstructorCall).arguments, isEmpty);
  });

  testWidgets('Library encoder: initial state', (WidgetTester tester) async {
    final Uint8List bytes = encodeLibraryBlob(const RemoteWidgetLibrary(<Import>[], <WidgetDeclaration>[
      WidgetDeclaration('a', <String, Object?>{ 'b': false }, ConstructorCall('c', <String, Object?>{})),
    ]));
    expect(bytes, <int>[
      0xfe, 0x52, 0x46, 0x57, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x61, 0x01, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x09,
      0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00,
    ]);
    final RemoteWidgetLibrary value = decodeLibraryBlob(bytes);
    expect(value.imports, isEmpty);
    expect(value.widgets, hasLength(1));
    expect(value.widgets.first.name, 'a');
    expect(value.widgets.first.initialState, isNotNull);
    expect(value.widgets.first.initialState!, hasLength(1));
    expect(value.widgets.first.initialState!['b'], false);
    expect(value.widgets.first.root, isA<ConstructorCall>());
    expect((value.widgets.first.root as ConstructorCall).name, 'c');
    expect((value.widgets.first.root as ConstructorCall).arguments, isEmpty);
  });
}
