#!/usr/bin/env python3
# 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()
