1# This program is free software; you can redistribute it and/or modify
2# it under the terms of the GNU General Public License as published by
3# the Free Software Foundation; either version 2 of the License, or
4# (at your option) any later version.
5
6from tests import TestCase, mkstemp
7
8import os
9
10from quodlibet.qltk.cbes import ComboBoxEntrySave, StandaloneEditor
11import quodlibet.config
12
13
14class TComboBoxEntrySave(TestCase):
15    memory = "pattern 1\npattern 2\n"
16    saved = "pattern text\npattern name\n"
17
18    def setUp(self):
19        quodlibet.config.init()
20        h, self.fname = mkstemp()
21        os.close(h)
22        with open(self.fname, "w") as f:
23            f.write(self.memory)
24
25        with open(self.fname + ".saved", "w") as f:
26            f.write(self.saved)
27        self.cbes = ComboBoxEntrySave(self.fname, count=2)
28        self.cbes2 = ComboBoxEntrySave(self.fname, count=2)
29
30    def test_equivalence(self):
31        model1 = self.cbes.get_model()
32        model2 = self.cbes2.get_model()
33        self.failUnlessEqual(model1, model2)
34
35        rows1 = list(model1)
36        rows2 = list(model2)
37
38        for row1, row2 in zip(rows1, rows2):
39            self.failUnlessEqual(row1[0], row2[0])
40            self.failUnlessEqual(row1[1], row2[1])
41            self.failUnlessEqual(row1[2], row2[2])
42
43    def test_text_changed_signal(self):
44        called = [0]
45
46        def cb(*args):
47            called[0] += 1
48
49        def get_count():
50            c = called[0]
51            called[0] = 0
52            return c
53
54        self.cbes.connect("text-changed", cb)
55        entry = self.cbes.get_child()
56        entry.set_text("foo")
57        self.failUnlessEqual(get_count(), 1)
58        self.cbes.prepend_text("bar")
59        # in case the model got changed but the entry is still the same
60        # the text-changed signal should not be triggered
61        self.failUnlessEqual(entry.get_text(), "foo")
62        self.failUnlessEqual(get_count(), 0)
63
64    def test_shared_model(self):
65        self.cbes.prepend_text("a test")
66        self.test_equivalence()
67
68    def test_initial_size(self):
69        # 1 saved, Edit, separator, 2 remembered
70        self.failUnlessEqual(len(self.cbes.get_model()), 5)
71
72    def test_prepend_text(self):
73        self.cbes.prepend_text("pattern 3")
74        self.memory = "pattern 3\npattern 1\n"
75        self.test_save()
76
77    def test_save(self):
78        self.cbes.write()
79        self.failUnlessEqual(self.memory, open(self.fname).read())
80        self.failUnlessEqual(self.saved, open(self.fname + ".saved").read())
81
82    def test_set_text_then_prepend(self):
83        self.cbes.get_child().set_text("foobar")
84        self.cbes.prepend_text("foobar")
85        self.memory = "foobar\npattern 1\n"
86        self.test_save()
87
88    def tearDown(self):
89        self.cbes.destroy()
90        self.cbes2.destroy()
91        os.unlink(self.fname)
92        os.unlink(self.fname + ".saved")
93        quodlibet.config.quit()
94
95
96class TStandaloneEditor(TestCase):
97    TEST_KV_DATA = [
98        ("Search Foo", "https://foo.com/search?q=<artist>-<title>")]
99
100    def setUp(self):
101        quodlibet.config.init()
102        h, self.fname = mkstemp()
103        os.close(h)
104        with open(self.fname + ".saved", "w") as f:
105            f.write(
106                "%s\n%s\n" % (self.TEST_KV_DATA[0][1],
107                              self.TEST_KV_DATA[0][0]))
108        self.sae = StandaloneEditor(self.fname, "test", None, None)
109
110    def test_constructor(self):
111        self.failUnless(self.sae.model)
112        data = [(row[1], row[0]) for row in self.sae.model]
113        self.failUnlessEqual(data, self.TEST_KV_DATA)
114
115    def test_load_values(self):
116        values = StandaloneEditor.load_values(self.fname + ".saved")
117        self.failUnlessEqual(self.TEST_KV_DATA, values)
118
119    def test_defaults(self):
120        defaults = [("Dot-com Dream", "http://<artist>.com")]
121        try:
122            os.unlink(self.fname)
123        except OSError:
124            pass
125        # Now create a new SAE without saved results and use defaults
126        self.fname = "foo"
127        self.sae.destroy()
128        self.sae = StandaloneEditor(self.fname, "test2", defaults, None)
129        self.sae.write()
130        data = [(row[1], row[0]) for row in self.sae.model]
131        self.failUnlessEqual(defaults, data)
132
133    def tearDown(self):
134        self.sae.destroy()
135        try:
136            os.unlink(self.fname)
137            os.unlink(self.fname + ".saved")
138        except OSError:
139            pass
140        quodlibet.config.quit()
141