#!/usr/bin/python
# Copyright (c) 2011, 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 emitter module."""

import logging.config
import unittest
import emitter
import multiemitter


class MultiEmitterTestCase(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def check(self, m, expected):
        """Verifies that the multiemitter contains the expected contents.

    Expected is a list of (filename, content) pairs, sorted by filename.
    """
        files = []

        def _Collect(file, contents):
            files.append((file, ''.join(contents)))

        m.Flush(_Collect)
        self.assertEquals(expected, files)

    def testExample(self):
        m = multiemitter.MultiEmitter()
        e1 = m.FileEmitter('file1')
        e2 = m.FileEmitter('file2', 'key2')
        e1.Emit('Hi 1')
        e2.Emit('Hi 2')
        m.Find('key2').Emit('Bye 2')
        self.check(m, [('file1', 'Hi 1'), ('file2', 'Hi 2Bye 2')])


if __name__ == '__main__':
    logging.config.fileConfig('logging.conf')
    if __name__ == '__main__':
        unittest.main()
