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