6 class T(unittest
.TestCase
):
9 'trivial.xml': '''<?xml version="1.0" encoding="ISO-8859-1"?>
10 <!DOCTYPE tv SYSTEM "http://iceguide.icetv.com.au/iceguide/iceguide.dtd">
13 <display-name>TwentyThree</display-name>
14 <region-name>Melbourne</region-name>
17 <programme start="20091030110000 +0000" stop="20091030113000 +0000" channel="2300">
18 <title lang="en">Spiderman</title>
19 <sub-title lang="en">The One Where Spiderman Eats Salad</sub-title>
20 <desc lang="en">Action is his reward.</desc>
21 <category lang="en">News</category>
22 <category lang="en">Sport</category>
23 <episode-num system="icetv">169-0</episode-num>
25 <programme start="20091104093500 +0000" stop="20091104110500 +0000" channel="32">
26 <title lang="en">Soccer: UEFA Champions League</title>
27 <sub-title lang="en">TBA</sub-title>
28 <category lang="en">Football</category>
29 <category lang="en">Soccer</category>
30 <category lang="en">Sport</category>
31 <episode-num system="icetv">14328-72386</episode-num>
32 <previously-shown start="20090917"/>
34 <programme start="20091105093500 +0000" stop="20091105110500 +0000" channel="32">
35 <title lang="en">Suburb of the Moths</title>
36 <desc lang="en">A suburb is terrorised by shrimp moths from hell.</desc>
38 <director>Dave Keenan</director>
39 <actor>Marvin O'Gravel Ballon-Face</actor>
40 <actor>Oliver Boliver Butt</actor>
41 <actor>Zanzibar Buck-Buck McBean</actor>
44 <category lang="en">Movie</category>
45 <subtitles type="teletext"/>
56 {'title': 'Spiderman',
57 'subtitle': 'The One Where Spiderman Eats Salad',
58 'desc': 'Action is his reward.',
59 'categories': ['News', 'Sport'],
61 'start': datetime
.datetime(2009, 10, 30, 11, 0),
62 'stop': datetime
.datetime(2009, 10, 30, 11, 30)}
64 def open_fake(self
, filename
):
65 from StringIO
import StringIO
66 return StringIO(self
.fake_files
[filename
])
69 self
.parser
= icetotgd
.IceToTgd()
70 self
.parser
.use_xml_file(self
.open_fake('trivial.xml'))
72 def test_can_load_channels(self
):
73 self
.assertEqual(self
.parser
.channels
,
74 {'2300': {'lcn': '23',
75 'display-name': 'TwentyThree'}})
77 def test_can_load_one_programme(self
):
78 p
= self
.parser
.programmes
[0]
79 self
.assertEqual(p
['title'], 'Spiderman')
80 self
.assertEqual(p
['subtitle'], 'The One Where Spiderman Eats Salad')
81 self
.assertEqual(p
['desc'], 'Action is his reward.')
82 self
.assertEqual(p
['categories'], ['News', 'Sport'])
83 self
.assertEqual(p
['channel'], '2300')
84 self
.assertEqual(p
['rating'], None)
85 self
.assertEqual(p
['start'], datetime
.datetime(2009, 10, 30, 11, 0))
86 self
.assertEqual(p
['stop'], datetime
.datetime(2009, 10, 30, 11, 30))
88 def test_time_to_tgd(self
):
89 start
= datetime
.datetime(2009, 10, 30, 11, 30)
90 tgd_start
= icetotgd
.tgd_time_from_timestamp(start
)
91 self
.assertEqual(tgd_start
, '2009/10/30 22:30')
93 def test_duration_to_tgd(self
):
94 start
= datetime
.datetime(2009, 10, 30, 11, 00)
95 stop
= datetime
.datetime(2009, 10, 30, 11, 30)
96 duration
= stop
- start
97 tgd_duration
= icetotgd
.tgd_duration_from_timedelta(duration
)
98 self
.assertEqual(tgd_duration
, '30')
100 def test_programme_to_tgd(self
):
101 tgd_line
= self
.parser
.programme_to_tgd(self
.programme
)
102 self
.assertEqual(tgd_line
,
103 '23\t2009/10/30 22:00\t30\tSpiderman\tThe One Where Spiderman Eats Salad [News/Sport]\tAction is his reward.\tX\tN')
105 def test_can_parse_programme_xml_without_desc(self
):
106 p
= self
.parser
.programmes
[1]
107 self
.assertEqual(p
['desc'], None)
109 def test_programme_xml_with_year(self
):
110 p
= self
.parser
.programmes
[2]
111 self
.assertEqual(p
['date'], '1996')
113 def test_tgd_title_includes_year(self
):
114 p
= self
.parser
.programmes
[2]
115 title
= self
.parser
.tgd_title(p
)
116 self
.assertEqual(title
, 'Suburb of the Moths (1996)')
118 def test_unrated_programmes_are_rated_x(self
):
119 p
= self
.parser
.programmes
[0]
120 rating
= self
.parser
.tgd_rating(p
)
121 self
.assertEqual(rating
, 'X')
123 def test_can_get_programme_rating(self
):
124 p
= self
.parser
.programmes
[2]
125 rating
= self
.parser
.tgd_rating(p
)
126 self
.assertEqual(rating
, 'M')
128 def test_description_says_subtitles_if_they_exist(self
):
129 p
= self
.parser
.programmes
[2]
130 description
= self
.parser
.tgd_description(p
)
131 self
.assertTrue(description
.index('[Subtitles]'))
133 def test_description_doesnt_say_repeat_if_its_not_a_repeat(self
):
134 p
= self
.parser
.programmes
[0]
135 description
= self
.parser
.tgd_description(p
)
136 self
.assertTrue(description
.find('[Repeat]') == -1)
138 def test_description_says_repeat_if_its_a_repeat(self
):
139 p
= self
.parser
.programmes
[2]
140 description
= self
.parser
.tgd_description(p
)
141 self
.assertTrue(description
.find('[Repeat]') != -1)
143 def test_description_says_repeat_with_date_if_its_a_repeat_with_a_known_date(self
):
144 p
= self
.parser
.programmes
[1]
145 description
= self
.parser
.tgd_description(p
)
146 date
= datetime
.date(2009, 9, 17).strftime('%x')
147 self
.assertTrue(description
.find('[Repeat, last shown ' + date
+ ']') != -1)
149 def test_tgd_short_description_includes_category(self
):
150 p
= self
.parser
.programmes
[0]
151 short_desc
= self
.parser
.tgd_short_description(p
)
152 self
.assertEqual(short_desc
, 'The One Where Spiderman Eats Salad [News/Sport]')
154 def test_can_convert_programme_xml_without_desc(self
):
155 p
= self
.programme
.copy()
157 tgd_line
= self
.parser
.programme_to_tgd(p
)
158 self
.assertEqual(tgd_line
,
159 '23\t2009/10/30 22:00\t30\tSpiderman\tThe One Where Spiderman Eats Salad [News/Sport]\t\tX\tN')
161 def test_str_or_empty(self
):
162 from icetotgd
import str_or_empty
163 self
.assertEqual('', str_or_empty(None))
164 self
.assertEqual('', str_or_empty(''))
165 self
.assertEqual('foo', str_or_empty('foo'))
167 def test_filename_from_programme(self
):
168 filename
= icetotgd
.tgd_filename_from_programme(self
.programme
)
169 self
.assertEqual(filename
, '20091030.tgd')
171 if __name__
=='__main__':