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