blob: 846ca4c591be71aeb63be62edfaf4fcc27bbc303 [file] [log] [blame]
// Copyright (c) 2013, 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:fixnum/fixnum.dart';
import 'package:test/test.dart';
import '../out/protos/entity.pb.dart';
import '../out/protos/nested_message.pb.dart';
void main() {
test('testFreezingNestedFields', () {
final top = Top()
..nestedMessageList.add(Nested()..a = 1)
..nestedMessageMap[1] = (Nested()..a = 2)
..nestedMessage = (Nested()..a = 3);
// Create aliases to lists, maps, nested messages
final list = top.nestedMessageList;
final map = top.nestedMessageMap;
final msg1 = top.nestedMessageList[0];
final msg2 = top.nestedMessageMap[1]!;
final msg3 = top.nestedMessage;
top.freeze();
expect(top.isFrozen, true);
// Check list field
expect(top.nestedMessageList.length, 1);
expect(top.nestedMessageList[0].isFrozen, true);
expect(() => top.nestedMessageList.add(Nested()..a = 0),
throwsA(const TypeMatcher<UnsupportedError>()));
// Check map field
expect(top.nestedMessageMap.length, 1);
expect(top.nestedMessageMap[1]!.isFrozen, true);
expect(() => top.nestedMessageMap[2] = Nested()..a = 0,
throwsA(const TypeMatcher<UnsupportedError>()));
expect(() => map[0] = Nested()..a = 0,
throwsA(const TypeMatcher<UnsupportedError>()));
// Check message field
expect(top.nestedMessage.isFrozen, true);
// Check aliases
expect(() => list.add(Nested()..a = 0),
throwsA(const TypeMatcher<UnsupportedError>()));
expect(() => map[123] = Nested()..a = 0,
throwsA(const TypeMatcher<UnsupportedError>()));
expect(list[0].isFrozen, true);
expect(map[1]!.isFrozen, true);
expect(msg1.isFrozen, true);
expect(msg2.isFrozen, true);
expect(msg3.isFrozen, true);
});
test('frozen messages should not be updated by merge methods', () {
final top = TopEntity()..freeze();
expect(() => top.mergeFromBuffer(<int>[]),
throwsA(TypeMatcher<UnsupportedError>()));
expect(() => top.mergeFromJsonMap({}),
throwsA(TypeMatcher<UnsupportedError>()));
expect(() => top.mergeFromMessage(TopEntity()),
throwsA(TypeMatcher<UnsupportedError>()));
expect(() => top.mergeFromProto3Json({}),
throwsA(TypeMatcher<UnsupportedError>()));
});
test('nested frozen messages should not be updated by merge methods', () {
// Check that recursive calls to merge methods check mutability.
// `mergeFromJsonMap` cannot be tested because of #726.
{
final top = TopEntity()..sub = (SubEntity()..freeze());
top.mergeFromBuffer(<int>[
(1 << 3) | 0, // tag = 1, type = varint
123, // int64 id = 123
]);
expect(top.id, Int64(123));
expect(
() => top.mergeFromBuffer(<int>[
(4 << 3) | 2, // tag = 4, type = length delimited
2, // length
(1 << 3) | 0, // tag = 1, type = varint
123, // int64 id = 123
]),
throwsA(TypeMatcher<UnsupportedError>()));
}
{
final top = TopEntity()..sub = (SubEntity()..freeze());
top.mergeFromMessage(TopEntity()..id = Int64(123));
expect(top.id, Int64(123));
expect(
() => top.mergeFromMessage(
TopEntity()..sub = (SubEntity()..id = Int64(123))),
throwsA(TypeMatcher<UnsupportedError>()));
}
{
final top = TopEntity()..sub = (SubEntity()..freeze());
top.mergeFromProto3Json({'id': 123});
expect(top.id, Int64(123));
expect(
() => top.mergeFromProto3Json({
'sub': {'id': 123}
}),
throwsA(TypeMatcher<UnsupportedError>()));
}
});
}