blob: 9fca5abb1cc1d6104c7e29196183e0a15774496c [file] [log] [blame]
import '../out/protos/foo.pb.dart';
import 'package:test/test.dart';
main() {
group('frozen and tobuilder', () {
Outer original = Outer()
..inner = (Inner()..value = 'foo')
..inners.add(Inner()..value = 'repeatedInner')
..setExtension(FooExt.inner, Inner()..value = 'extension')
..getExtension(FooExt.inners).add(Inner()..value = 'repeatedExtension')
..freeze();
test('can read extensions', () {
expect(original.getExtension(FooExt.inner).value, 'extension');
expect(
original.getExtension(FooExt.inners)[0].value, 'repeatedExtension');
});
test('frozen message cannot be modified', () {
expect(() => original.inner = (Inner()..value = 'bar'),
throwsA(TypeMatcher<UnsupportedError>()));
expect(() => original.inner..value = 'bar',
throwsA(TypeMatcher<UnsupportedError>()));
expect(() => original.inners.add(Inner()..value = 'bar'),
throwsA(TypeMatcher<UnsupportedError>()));
});
test('extensions cannot be modified', () {
expect(() => original.setExtension(FooExt.inner, Inner()..value = 'bar'),
throwsA(TypeMatcher<UnsupportedError>()));
expect(() => original.getExtension(FooExt.inner).value = 'bar',
throwsA(TypeMatcher<UnsupportedError>()));
expect(
() =>
original.getExtension(FooExt.inners).add(Inner()..value = 'bar'),
throwsA(TypeMatcher<UnsupportedError>()));
});
Outer builder = original.toBuilder();
test('builder is a shallow copy', () {
expect(builder.inner, same(original.inner));
});
test('builder extensions are also copied shallowly', () {
expect(builder.getExtension(FooExt.inner),
same(original.getExtension(FooExt.inner)));
});
test('repeated fields are cloned', () {
expect(builder.inners, isNot(same(original.inners)));
expect(builder.inners[0], same(original.inners[0]));
});
test('repeated extensions are cloned', () {
expect(builder.getExtension(FooExt.inners),
isNot(same(original.getExtension(FooExt.inners))));
expect(builder.getExtension(FooExt.inners)[0],
same(original.getExtension(FooExt.inners)[0]));
});
test(
'the builder is only a shallow copy, the nested message is still frozen.',
() {
expect(() => builder.inner.value = 'bar',
throwsA(TypeMatcher<UnsupportedError>()));
});
test('the builder is mutable', () {
builder.inner = (Inner()..value = 'zop');
expect(builder.inner.value, 'zop');
builder.inners.add(Inner()..value = 'bob');
expect(builder.inners.length, 2);
builder.setExtension(FooExt.inner, Inner()..value = 'nob');
expect(builder.getExtension(FooExt.inner).value, 'nob');
builder.getExtension(FooExt.inners).add(Inner()..value = 'rob');
expect(builder.getExtension(FooExt.inners).length, 2);
});
test('newly created `Inner` is mutable', () {
builder.inner.value = 'bar';
expect(builder.inner.value, 'bar');
});
});
group('map properties behave correctly', () {
OuterWithMap original;
OuterWithMap outerBuilder;
setUp(() {
original = OuterWithMap()
..innerMap[1] = (Inner()..value = 'mapInner')
..freeze();
outerBuilder = original.toBuilder();
});
test('map fields are cloned', () {
expect(outerBuilder.innerMap, isNot(same(original.innerMap)));
expect(outerBuilder.innerMap[1], same(original.innerMap[1]));
});
test('the builder is mutable', () {
outerBuilder.innerMap[1] = (Inner()..value = 'mob');
expect(outerBuilder.innerMap[1].value, 'mob');
});
});
}