blob: e99958a46a969c602ab7174eaf04ee83488db451 [file] [log] [blame]
// Copyright (c) 2018, 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.
import 'package:test/test.dart'
show expect, isA, predicate, same, test, throwsA, throwsArgumentError;
import '../out/protos/map_api.pb.dart' as pb;
import '../out/protos/map_api2.pb.dart' as pb2;
void main() {
test("message doesn't implement Map when turned off", () {
expect(pb.NonMap(), predicate((x) => x is! Map));
expect(pb2.NonMap2(), predicate((x) => x is! Map));
});
test('message implements Map when turned on', () {
expect(pb.Rec(), predicate((x) => x is Map));
expect(pb2.Rec2(), predicate((x) => x is Map));
});
test('operator [] returns null for unrecognized keys', () {
final rec = pb.Rec();
expect(rec['noSuchField'], null);
expect(rec[1234], null);
expect(rec[null], null);
});
test('operator [] returns default value when not set', () {
final rec = pb.Rec();
expect(rec['num'], 0);
expect(rec['nums'], []);
expect(rec['str'], '');
expect(rec['msg'], predicate((x) => x is pb.NonMap));
});
test('operator [] returns new value when set', () {
final rec = pb.Rec();
rec.num = 42;
expect(rec['num'], 42);
rec.nums.add(123);
expect(rec['nums'], [123]);
rec.str = 'hello';
expect(rec['str'], 'hello');
final msg = pb.NonMap();
rec.msg = msg;
expect(rec['msg'], same(msg));
});
test('operator []= throws exception for invalid key', () {
final rec = pb.Rec();
expect(() {
rec['unknown'] = 123;
},
throwsA(isA<ArgumentError>().having((p0) => p0.message, 'message',
"field 'unknown' not found in protobuf_unittest.Rec")));
});
test('operator []= throws exception for repeated field', () {
// Copying the values would be confusing.
final rec = pb.Rec();
expect(() {
rec['nums'] = [1, 2];
}, throwsArgumentError);
});
test('operator []= throws exception for invalid value type', () {
final rec = pb.Rec();
expect(() {
rec['num'] = 'hello';
}, throwsArgumentError);
expect(() {
rec['str'] = 123;
}, throwsArgumentError);
});
test('operator []= sets the field', () {
final rec = pb.Rec();
rec['num'] = 123;
expect(rec.num, 123);
rec['str'] = 'hello';
expect(rec.str, 'hello');
});
test('keys returns each field name (even when unset)', () {
final rec = pb.Rec();
expect(Set.from(rec.keys), {'msg', 'num', 'nums', 'str'});
});
test('containsKey returns true for fields that exist (even when unset)', () {
final rec = pb.Rec();
expect(rec.containsKey('unknown'), false);
expect(rec.containsKey('str'), true);
expect(rec.containsKey('num'), true);
expect(rec.containsKey('nums'), true);
expect(rec.containsKey('msg'), true);
});
test('length is constant', () {
final rec = pb.Rec();
expect(rec.length, 4);
rec.str = 'hello';
expect(rec.length, 4);
});
test("remove isn't supported", () {
final rec = pb.Rec();
rec.str = 'hello';
expect(() {
rec.remove('str');
},
throwsA(isA<UnsupportedError>().having((p0) => p0.message, 'message',
'remove() not supported by protobuf_unittest.Rec')));
expect(rec.str, 'hello');
});
test('clear sets each field to its default value (unlike a regular Map)', () {
// We have little choice here since the clear() method already existed.
final rec = pb.Rec();
rec.str = 'hello';
rec.num = 123;
rec.nums.add(456);
rec.clear();
expect(rec.length, 4);
expect(rec['str'], '');
expect(rec['num'], 0);
expect(rec['nums'], []);
});
test('addAll sets each field to a new value', () {
final rec = pb.Rec();
rec.addAll({'str': 'hello', 'num': 123});
expect(rec['str'], 'hello');
expect(rec['num'], 123);
});
test("addAll doesn't work for repeated fields", () {
// It would be confusing to copy the values.
final rec = pb.Rec();
expect(() {
rec.addAll({
'nums': [1, 2, 3]
});
}, throwsArgumentError);
});
}