| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // Unit tests for PbMapMixin. |
| // There are more tests in the dart-protoc-plugin package. |
| |
| import 'dart:collection' show MapMixin; |
| |
| import 'package:protobuf/protobuf.dart'; |
| import 'package:protobuf/src/protobuf/mixins/map_mixin.dart'; |
| import 'package:test/test.dart' |
| show expect, isA, same, test, throwsArgumentError; |
| |
| import 'mock_util.dart' show MockMessage, mockInfo; |
| |
| // A minimal protobuf implementation compatible with PbMapMixin. |
| class Rec extends MockMessage with MapMixin<Object?, Object>, PbMapMixin { |
| @override |
| BuilderInfo get info_ => _info; |
| static final _info = mockInfo('Rec', Rec.new); |
| @override |
| Rec createEmptyInstance() => Rec(); |
| |
| @override |
| String toString() => 'Rec($val, "$str")'; |
| } |
| |
| void main() { |
| test('PbMapMixin methods return default field values', () { |
| final r = Rec(); |
| |
| expect(r.isEmpty, false); |
| expect(r.isNotEmpty, true); |
| expect(r.keys, ['val', 'str', 'child', 'int32s', 'int64', 'enm']); |
| |
| expect(r['val'], 42); |
| expect(r['str'], ''); |
| expect(r['child'], isA<Rec>()); |
| expect(r['child'].toString(), 'Rec(42, "")'); |
| expect(r['int32s'], []); |
| |
| final v = r.values; |
| expect(v.length, 6); |
| expect(v.first, 42); |
| expect(v.toList()[1], ''); |
| expect(v.toList()[3].toString(), '[]'); |
| expect(v.toList()[4], 0); |
| expect((v.toList()[5] as ProtobufEnum).name, 'a'); |
| }); |
| |
| test('operator []= sets record fields', () { |
| final r = Rec(); |
| |
| r['val'] = 123; |
| expect(r.val, 123); |
| expect(r['val'], 123); |
| |
| r['str'] = 'hello'; |
| expect(r.str, 'hello'); |
| expect(r['str'], 'hello'); |
| |
| final child = Rec(); |
| r['child'] = child; |
| expect(r.child, same(child)); |
| expect(r['child'], same(child)); |
| |
| expect(() => r['int32s'] = 123, throwsArgumentError); |
| (r['int32s'] as List).add(123); |
| expect(r['int32s'], [123]); |
| expect(r['int32s'], same(r['int32s'])); |
| }); |
| |
| test('operator== and hashCode work for Map mixin', () { |
| final a = Rec(); |
| expect(a == a, true); |
| expect(a == {}, false); |
| expect({} == a, false); |
| |
| final b = Rec(); |
| expect(a.info_ == b.info_, true, reason: 'BuilderInfo should be the same'); |
| expect(a == b, true); |
| expect(a.hashCode, b.hashCode); |
| |
| a.val = 123; |
| expect(a == b, false); |
| b.val = 123; |
| expect(a == b, true); |
| expect(a.hashCode, b.hashCode); |
| |
| a.child = Rec(); |
| expect(a == b, false); |
| b.child = Rec(); |
| expect(a == b, true); |
| expect(a.hashCode, b.hashCode); |
| }); |
| |
| test("protobuf doesn't compare equal to a map with the same values", () { |
| final a = Rec(); |
| expect(a == Map.from(a), false); |
| expect(Map.from(a) == a, false); |
| }); |
| |
| test("reading protobuf values shouldn't change equality", () { |
| final a = Rec(); |
| final b = Rec(); |
| expect(a == b, true); |
| Map.from(a); |
| expect(a == b, true); |
| }); |
| } |