blob: b0f9248c963e64c0ff56b7d233eb7b8f44941edc [file] [log] [blame]
#!/usr/bin/env dart
// 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.
library map_mixin_test;
import 'dart:collection' show MapMixin;
import 'package:protobuf/protobuf.dart'
show GeneratedMessage, PbMapMixin, BuilderInfo;
import 'package:protobuf/src/protobuf/mixins/map_mixin.dart';
import 'package:unittest/unittest.dart' show test, expect, predicate, same;
// A minimal protobuf implementation compatible with PbMapMixin.
class Rec extends GeneratedMessage with MapMixin, PbMapMixin {
int val = 0;
String str = "";
Rec child;
@override
BuilderInfo info_ = new BuilderInfo("rec")
..a(1, "val", null)
..a(2, "str", null)
..a(3, "child", null);
@override
void clear() {
val = 0;
str = "";
child = null;
}
@override
int getTagNumber(String fieldName) {
switch (fieldName) {
case 'val':
return 1;
case 'str':
return 2;
case 'child':
return 3;
default:
return null;
}
}
@override
getField(int tagNumber) {
switch (tagNumber) {
case 1:
return val;
case 2:
return str;
case 3:
// lazy initializaton
if (child == null) {
child = new Rec();
}
return child;
default:
return null;
}
}
@override
void setField(int tagNumber, var value, [int fieldType = null]) {
switch (tagNumber) {
case 1:
val = value;
return;
case 2:
str = value;
return;
case 3:
child = value;
return;
default:
throw new ArgumentError("Rec doesn't support tag: ${tagNumber}");
}
}
@override
String toString() {
return "Rec(${val}, \"${str}\", ${child})";
}
}
main() {
test('PbMapMixin methods return default field values', () {
var r = new Rec();
expect(r.isEmpty, false);
expect(r.isNotEmpty, true);
expect(r.keys, ["val", "str", "child"]);
expect(r["val"], 0);
expect(r["str"], "");
expect(r["child"].runtimeType, Rec);
expect(r["child"].toString(), 'Rec(0, "", null)');
var v = r.values;
expect(v.length, 3);
expect(v.first, 0);
expect(v.toList()[1], "");
expect(v.last.toString(), 'Rec(0, "", null)');
});
test('operator []= sets record fields', () {
var r = new Rec();
r["val"] = 123;
expect(r.val, 123);
expect(r["val"], 123);
r["str"] = "hello";
expect(r.str, "hello");
expect(r["str"], "hello");
var child = new Rec();
r["child"] = child;
expect(r.child, same(child));
expect(r["child"], same(child));
});
}