1###############################################################################
2#
3# Copyright (c) 2011 Ruslan Spivak
4#
5# Permission is hereby granted, free of charge, to any person obtaining a copy
6# of this software and associated documentation files (the "Software"), to deal
7# in the Software without restriction, including without limitation the rights
8# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9# copies of the Software, and to permit persons to whom the Software is
10# furnished to do so, subject to the following conditions:
11#
12# The above copyright notice and this permission notice shall be included in
13# all copies or substantial portions of the Software.
14#
15# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21# THE SOFTWARE.
22#
23###############################################################################
24
25__author__ = 'Ruslan Spivak <ruslan.spivak@gmail.com>'
26
27import os
28import sys
29import StringIO
30import tempfile
31import unittest
32
33from contextlib import contextmanager
34
35
36@contextmanager
37def redirected_input_output(input=''):
38    old_inp, old_out = sys.stdin, sys.stdout
39    inp, out = StringIO.StringIO(input), StringIO.StringIO()
40    sys.stdin, sys.stdout = inp, out
41    try:
42        yield out
43    finally:
44        sys.stdin, sys.stdout = old_inp, old_out
45
46
47@contextmanager
48def redirected_sys_argv(argv):
49    old = sys.argv
50    sys.argv = argv
51    try:
52        yield argv
53    finally:
54        sys.argv = old
55
56
57class CmdTestCase(unittest.TestCase):
58
59    def setUp(self):
60        fd, path = tempfile.mkstemp()
61        self.path = path
62        with os.fdopen(fd, 'w') as fout:
63            fout.write('var global = 5;')
64
65    def tearDown(self):
66        os.remove(self.path)
67
68    def test_main_dash_m_with_input_file(self):
69        from slimit.minifier import main
70        out = StringIO.StringIO()
71        main(['-m', '-t', self.path], out=out)
72        self.assertEqual('var a=5;', out.getvalue())
73
74    def test_main_dash_dash_mangle_with_input_file(self):
75        from slimit.minifier import main
76        out = StringIO.StringIO()
77        main(['--mangle', '--mangle-toplevel', self.path], out=out)
78        self.assertEqual('var a=5;', out.getvalue())
79
80    def test_main_dash_m_with_mock_stdin(self):
81        from slimit.minifier import main
82        out = StringIO.StringIO()
83        inp = StringIO.StringIO('function foo() { var local = 5; }')
84        main(['-m'], inp=inp, out=out)
85        self.assertEqual('function foo(){var a=5;}', out.getvalue())
86
87    def test_main_stdin_stdout(self):
88        # slimit.minifier should be deleted from sys.modules in order
89        # to have a proper reference to sys.stdin and sys.stdou when
90        # 'main' definition is evaluated during module import
91        old_module = None
92        try:
93            old_module = sys.modules.pop('slimit.minifier')
94        except KeyError:
95            pass
96
97        with redirected_input_output(
98            input='function foo() { var local = 5; }') as out:
99            from slimit.minifier import main
100            main(['-m'])
101
102        self.assertEqual('function foo(){var a=5;}', out.getvalue())
103        if old_module is not None:
104            sys.modules['slimit.minifier'] = old_module
105
106    def test_main_sys_argv(self):
107        out = StringIO.StringIO()
108        inp = StringIO.StringIO('var global = 5;')
109        with redirected_sys_argv(['slimit', '-m', '-t']):
110            from slimit.minifier import main
111            main(inp=inp, out=out)
112
113        self.assertEqual('var a=5;', out.getvalue())
114