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 7 8from quodlibet.util.massagers import Massager, validate, is_valid, \ 9 error_message, get_options, ValidationError 10 11 12class TMassagers(TestCase): 13 def validate(self, key, values): 14 massager = Massager.for_tag(key) 15 for val in values: 16 self.assertTrue(massager.is_valid(val)) 17 self.assertTrue( 18 isinstance(massager.validate(str(val)), str)) 19 20 def invalidate(self, key, values): 21 for val in values: 22 self.failIf(Massager.for_tag(key).is_valid(val)) 23 24 def equivs(self, key, equivs): 25 massager = Massager.for_tag(key) 26 for value, normed in equivs.items(): 27 self.assertEqual(normed, massager.validate(value)) 28 self.assertTrue( 29 isinstance(massager.validate(str(value)), str)) 30 31 def test_validate_helper(self): 32 self.assertEqual(validate("foo", "bar"), "bar") 33 self.assertRaises(ValidationError, validate, "date", "bar") 34 self.assertEqual(validate("date", "2000"), "2000") 35 36 def test_is_valid_helper(self): 37 self.assertTrue(is_valid("foo", "bar")) 38 self.assertFalse(is_valid("date", "bar")) 39 self.assertTrue(is_valid("date", "2000")) 40 41 def test_error_message_helper(self): 42 self.assertFalse(error_message("foo", "bar")) 43 self.assertTrue(error_message("date", "2000")) 44 45 def test_get_options_helper(self): 46 self.assertFalse(get_options("foo")) 47 self.assertTrue(get_options("language")) 48 49 def test_date_valid(self): 50 self.validate("date", ["2002-10-12", "2000", "1200-10", "0000-00-00", 51 "1999/09/12"]) 52 53 def test_date_invalid(self): 54 self.invalidate("date", ["200", "date-or-no", "", "2000-00-00-00"]) 55 56 def test_date_equivs(self): 57 self.equivs("date", {"2000": "2000", "1999-99-99": "1999-99-99", 58 "1999/12/09": "1999-12-09"}) 59 60 def test_gain_valid(self): 61 gains = ["+2.12 dB", "99. dB", "-1.11 dB", "-0.99 dB", "0 dB"] 62 self.validate('replaygain_track_gain', gains) 63 self.validate('replaygain_album_gain', gains) 64 65 def test_gain_invalid(self): 66 gains = ["hooray", "", "dB dB"] 67 self.invalidate('replaygain_track_gain', gains) 68 self.invalidate('replaygain_album_gain', gains) 69 70 def test_gain_equivs(self): 71 equivs = {"12.1 dB": "+12.1 dB", "-1.00 dB": "-1.00 dB", "0": "+0. dB"} 72 self.equivs("replaygain_track_gain", equivs) 73 self.equivs("replaygain_album_gain", equivs) 74 75 def test_peak_valid(self): 76 peaks = ["0.54", "0.999", "0", "1.234", "1.99"] 77 self.validate('replaygain_track_peak', peaks) 78 self.validate('replaygain_album_peak', peaks) 79 80 def test_peak_invalid(self): 81 peaks = ["", "100 dB", "woooo", "12.12.12", "-18", "2.23"] 82 self.invalidate('replaygain_track_peak', peaks) 83 self.invalidate('replaygain_album_peak', peaks) 84 85 def test_mbid_valid(self): 86 self.validate("musicbrainz_trackid", 87 ["cafebabe-ffff-eeee-0101-deadbeafffff", 88 "Fef1F0f4-dead-a5da-d0D0-86753099ffff"]) 89 90 def test_mbid_invalid(self): 91 self.invalidate("musicbrainz_trackid", 92 ["", "cafebab!-ffff-eeee-0101-deadbeaf", 93 "Fef1F0f4-dead-a5da-d0D0-8675309z"]) 94 95 def test_mbid_equivs(self): 96 self.equivs("musicbrainz_trackid", 97 {"cafebabe-ffff-eeee-0101-deadbeafffff": 98 "cafebabe-ffff-eeee-0101-deadbeafffff", 99 "Fef1F0f4-dead-a5da-d0D0-86753099ffff": 100 "fef1f0f4-dead-a5da-d0d0-86753099ffff" 101 }) 102 103 def test_albumstatus(self): 104 self.validate("musicbrainz_albumstatus", 105 ["official", "promotional", "bootleg"]) 106 self.invalidate("musicbrainz_albumstatus", 107 ["", "unofficial", "\x99"]) 108 109 def test_language_valid(self): 110 self.validate("language", ["eng", "zho", "lol", "fre", "ger", "zza"]) 111 self.validate("language", ["deu", "fra", "msa"]) 112 # self.invalidate("language", ["xxx", "ROFL", "", "es", "ENG"]) 113 # Issue 439: Actually, allow free-text. 114 self.validate("language", ["", "German", "Chinese", "Foobarlanguage"]) 115 mas = Massager.for_tag("language") 116 117 # Check completion help too 118 for code in ["eng", "fra", "fre", "deu", "zho"]: 119 self.failUnless(code in mas.options, 120 "'%s' should be in languages options" % code) 121 self.failIf("" in mas.options) 122