| Index: pkg/code_transformers/test/messages_test.dart | 
| diff --git a/pkg/code_transformers/test/messages_test.dart b/pkg/code_transformers/test/messages_test.dart | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..b03ca1c24a7ab2b4e6dc62a27848669dd9a2af66 | 
| --- /dev/null | 
| +++ b/pkg/code_transformers/test/messages_test.dart | 
| @@ -0,0 +1,111 @@ | 
| +// Copyright (c) 2014, 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. | 
| + | 
| +/// Tests for some of the utility helper functions used by the compiler. | 
| +library polymer.test.build.messages_test; | 
| + | 
| +import 'dart:convert'; | 
| +import 'package:unittest/unittest.dart'; | 
| +import 'package:code_transformers/messages/messages.dart'; | 
| +import 'package:source_span/source_span.dart'; | 
| + | 
| +main() { | 
| +  group('snippet', () { | 
| +    test('template with no-args works', () { | 
| +      expect(new MessageTemplate(_id('code_transformers', 1), | 
| +            'this message has no args', '', '').snippet, | 
| +          'this message has no args'); | 
| +    }); | 
| + | 
| +    test('template with args throws', () { | 
| +      expect(() => new MessageTemplate(_id('code_transformers', 1), | 
| +            'this message has %-args-%', '', '') | 
| +          .snippet, | 
| +          throws); | 
| +    }); | 
| + | 
| +    test('can pass arguments to create snippet', () { | 
| +      expect(new MessageTemplate(_id('code_transformers', 1), | 
| +            'a %-b-% c something %-name-% too', '', '') | 
| +          .create({'b': "1", 'name': 'foo'}).snippet, | 
| +          'a 1 c something foo too'); | 
| +    }); | 
| +  }); | 
| + | 
| +  test('equals', () { | 
| +      expect(new MessageId('hi', 23) == new MessageId('hi', 23), isTrue); | 
| +      expect(new MessageId('foo', 23) != new MessageId('bar', 23), isTrue); | 
| +      expect(new MessageId('foo', 22) != new MessageId('foo', 23), isTrue); | 
| +  }); | 
| + | 
| +  for (var encode in [true, false]) { | 
| +    var toJson = encode | 
| +        ? (o) => o.toJson() | 
| +        : (o) => JSON.decode(JSON.encode(o)); | 
| +    group('serialize/deserialize ${encode ? "and stringify": ""}', () { | 
| +      test('message id', () { | 
| +        _eq(msg) { | 
| +          expect(new MessageId.fromJson(toJson(msg)) == msg, isTrue); | 
| +        } | 
| +        _eq(const MessageId('hi', 23)); | 
| +        _eq(new MessageId('hi', 23)); | 
| +        _eq(new MessageId('a_b', 23)); | 
| +        _eq(new MessageId('a-b', 23)); | 
| +        _eq(new MessageId('a-b-', 3)); | 
| +        _eq(new MessageId('a', 21)); | 
| +      }); | 
| + | 
| +      test('message', () { | 
| +        _eq(msg) { | 
| +          var parsed = new Message.fromJson(toJson(msg)); | 
| +          expect(msg.id, parsed.id); | 
| +          expect(msg.snippet, parsed.snippet); | 
| +        } | 
| +        _eq(new Message(_id('hi', 33), 'snippet here')); | 
| +        _eq(new MessageTemplate(_id('hi', 33), 'snippet', 'ignored', 'ignored')); | 
| +      }); | 
| + | 
| +      test('log entry', () { | 
| +        _eq(entry) { | 
| +          var parsed = new BuildLogEntry.fromJson(toJson(entry)); | 
| +          expect(entry.message.id, parsed.message.id); | 
| +          expect(entry.message.snippet, entry.message.snippet); | 
| +          expect(entry.level, parsed.level); | 
| +          expect(entry.span, parsed.span); | 
| +        } | 
| +        _eq(_entry(33, 'hi there', 12)); | 
| +        _eq(_entry(33, 'hi there-', 11)); | 
| +      }); | 
| + | 
| +      test('log entry table', () { | 
| +        var table = new LogEntryTable(); | 
| +        table.add(_entry(11, 'hi there', 23)); | 
| +        table.add(_entry(13, 'hi there', 21)); | 
| +        table.add(_entry(11, 'hi there', 26)); | 
| +        expect(table.entries.length, 2); | 
| +        expect(table.entries[_id('hi', 11)].length, 2); | 
| +        expect(table.entries[_id('hi', 13)].length, 1); | 
| + | 
| +        var table2 = new LogEntryTable.fromJson(toJson(table)); | 
| +        expect(table2.entries.length, 2); | 
| +        expect(table2.entries[_id('hi', 11)].length, 2); | 
| +        expect(table2.entries[_id('hi', 13)].length, 1); | 
| +        expect(table2.entries[_id('hi', 11)][0].span, | 
| +            table.entries[_id('hi', 11)][0].span); | 
| +        expect(table2.entries[_id('hi', 11)][1].span, | 
| +            table.entries[_id('hi', 11)][1].span); | 
| +        expect(table2.entries[_id('hi', 13)][0].span, | 
| +            table.entries[_id('hi', 13)][0].span); | 
| +      }); | 
| +    }); | 
| +  } | 
| +} | 
| +_id(s, i) => new MessageId(s, i); | 
| +_entry(id, snippet, offset) => new BuildLogEntry( | 
| +    new Message(_id('hi', id), snippet), | 
| +    new SourceSpan( | 
| +      new SourceLocation(offset, sourceUrl: 'a', line: 1, column: 3), | 
| +      new SourceLocation(offset + 2, sourceUrl: 'a', line: 1, column: 5), | 
| +      'hi'), | 
| +    'Warning'); | 
|  |