# Copyright 2021 (c) Anna Schumaker. import unittest from gi.repository import GObject from gi.repository import Gtk from gi.repository import Gst from . import scale class FakePlayer(GObject.GObject): def __init__(self, position, duration, volume): GObject.GObject.__init__(self) self.pos = position self.dur = duration self.vol = volume @GObject.Property def position(self): return self.pos @position.setter def position(self, newval): self.pos = newval self.emit("position-changed") @GObject.Signal def position_changed(self): pass @GObject.Property def duration(self): return self.dur @GObject.Signal def duration_changed(self): pass def seek(self, value): self.seek_val = value @GObject.Property def volume(self): return self.vol @volume.setter def volume(self, volume): self.vol = volume class TestScalePlus(unittest.TestCase): def on_change_value(self, scale, scroll, value): self.change_value = (scroll, value) def test_scale_plus_init(self): splus = scale.ScalePlus(1, 10, 2, 5) adj = splus.get_adjustment() self.assertIsInstance(splus, Gtk.Scale) self.assertTrue(splus.get_draw_value()) self.assertTrue(splus.get_hexpand()) self.assertEqual(splus.get_value_pos(), Gtk.PositionType.TOP) self.assertEqual(adj.get_value(), 1) self.assertEqual(adj.get_lower(), 1) self.assertEqual(adj.get_upper(), 10) self.assertEqual(adj.get_step_increment(), 2) self.assertEqual(adj.get_page_increment(), 5) def test_scale_plus_decrement(self): splus = scale.ScalePlus(1, 10, 2, 5) splus.set_value(10) splus.connect("change-value", self.on_change_value) for i in [ 8, 6, 4, 2, 1 ]: self.assertEqual(splus.decrement(), i) self.assertEqual(splus.format_value(splus, i), str(i)) self.assertEqual(self.change_value, (Gtk.ScrollType.STEP_BACKWARD, i)) self.change_value = None self.assertIsNone(splus.decrement()) self.assertIsNone(self.change_value) def test_scale_plus_increment(self): splus = scale.ScalePlus(1, 10, 2, 5) splus.connect("change-value", self.on_change_value) for i in [ 3, 5, 7, 9, 10 ]: self.assertEqual(splus.increment(), i) self.assertEqual(splus.format_value(splus, i), str(i)) self.assertEqual(self.change_value, (Gtk.ScrollType.STEP_FORWARD, i)) self.change_value = None self.assertIsNone(splus.increment()) self.assertIsNone(self.change_value) class TestSeekScale(unittest.TestCase): def test_seek_scale_init(self): fake = FakePlayer(0, 5 * Gst.SECOND, 1) seek = scale.SeekScale(fake) adj = seek.get_adjustment() self.assertIsInstance(seek, scale.ScalePlus) self.assertEqual(seek.get_size_request(), (200, -1)) self.assertEqual(seek.player, fake) self.assertEqual(adj.get_value(), 0) self.assertEqual(adj.get_lower(), 0) self.assertEqual(adj.get_upper(), 5 * Gst.SECOND) self.assertEqual(adj.get_step_increment(), 5 * Gst.SECOND) self.assertEqual(adj.get_page_increment(), 30 * Gst.SECOND) def test_seek_scale_duration(self): fake = FakePlayer(0, 2 * Gst.SECOND, 1) seek = scale.SeekScale(fake) adj = seek.get_adjustment() self.assertEqual(adj.get_upper(), 2 * Gst.SECOND) fake.dur = 3 * Gst.SECOND fake.emit("duration-changed") self.assertEqual(adj.get_upper(), 3 * Gst.SECOND) def test_seek_scale_position(self): fake = FakePlayer(0, 15 * Gst.SECOND, 1) seek = scale.SeekScale(fake) adj = seek.get_adjustment() fake.position = 3 * Gst.SECOND self.assertEqual(seek.player, fake) self.assertEqual(adj.get_value(), 3 * Gst.SECOND) self.assertEqual(adj.get_lower(), 0) def test_seek_scale_values(self): fake = FakePlayer(0, 15 * Gst.SECOND, 1) seek = scale.SeekScale(fake) seek.increment() self.assertEqual(fake.pos, 5 * Gst.SECOND) self.assertEqual(seek.format_value(seek, 5 * Gst.SECOND), "00:05 / 00:10") seek.decrement() self.assertEqual(fake.pos, 0) class TestAutoPauseScale(unittest.TestCase): def test_autopause_scale_init(self): pause = scale.AutoPauseScale() adj = pause.get_adjustment() self.assertIsInstance(pause, scale.ScalePlus) self.assertEqual(pause.get_digits(), 0) self.assertEqual(adj.get_value(), -1) self.assertEqual(adj.get_lower(), -1) self.assertEqual(adj.get_upper(), 99) self.assertEqual(adj.get_step_increment(), 1) self.assertEqual(adj.get_page_increment(), 5) self.assertTrue(pause.keep_playing) def test_autopause_scale_values(self): pause = scale.AutoPauseScale() self.assertEqual(pause.format_value(pause, -1), "Keep Playing") self.assertEqual(pause.format_value(pause, 0), "This Track") self.assertEqual(pause.format_value(pause, 1), "Next Track") self.assertEqual(pause.format_value(pause, 2), "2 Tracks") def test_keep_playing(self): pause = scale.AutoPauseScale() pause.set_value(2) pause.decrement() self.assertEqual(pause.get_value(), 1) self.assertFalse(pause.about_to_pause()) self.assertTrue(pause.keep_playing) pause.decrement() self.assertEqual(pause.get_value(), 0) self.assertTrue(pause.about_to_pause()) self.assertTrue(pause.keep_playing) pause.decrement() self.assertEqual(pause.get_value(), -1) self.assertFalse(pause.about_to_pause()) self.assertFalse(pause.keep_playing) pause.decrement() self.assertEqual(pause.get_value(), -1) self.assertFalse(pause.about_to_pause()) self.assertTrue(pause.keep_playing) class TestVolumeScale(unittest.TestCase): def test_volume_scale_init(self): fake = FakePlayer(0, 5 * Gst.SECOND, 1.0) volume = scale.VolumeScale(fake) adj = volume.get_adjustment() self.assertIsInstance(volume, scale.ScalePlus) self.assertEqual(volume.player, fake) self.assertEqual(adj.get_value(), 1.0) self.assertEqual(adj.get_lower(), 0.0) self.assertEqual(adj.get_upper(), 1.0) self.assertEqual(adj.get_step_increment(), 0.05) self.assertEqual(adj.get_page_increment(), 0.25) fake.volume = 0.5 vol2 = scale.VolumeScale(fake) self.assertEqual(vol2.get_value(), 0.5) def test_volume_scale_values(self): fake = FakePlayer(0, 15 * Gst.SECOND, 0.5) volume = scale.VolumeScale(fake) volume.increment() self.assertEqual(fake.volume, 0.55) self.assertEqual(volume.format_value(volume, 0.55), "55%") volume.decrement() self.assertEqual(fake.volume, 0.50) self.assertEqual(volume.format_value(volume, 0.50), "50%") class TestScaleButton(unittest.TestCase): def test_scale_button(self): splus = scale.ScalePlus(0, 5, 1, 1) sbutt = scale.ScaleButton(splus, "missing-icon") self.assertIsInstance(sbutt, Gtk.Button) self.assertEqual(sbutt.get_valign(), Gtk.Align.END) self.assertTrue(sbutt.has_css_class("normal-icons")) self.assertTrue(sbutt.has_css_class("flat")) class TestDecrementButton(unittest.TestCase): def test_decrement_button(self): splus = scale.ScalePlus(0, 5, 1, 1) dec = scale.DecrementButton(splus) splus.set_value(1) self.assertIsInstance(dec, scale.ScaleButton) self.assertEqual(dec.get_icon_name(), "list-remove-symbolic") dec.emit("clicked") self.assertEqual(splus.get_value(), 0) class TestIncrementButton(unittest.TestCase): def test_increment_button(self): splus = scale.ScalePlus(0, 5, 1, 1) inc = scale.IncrementButton(splus) self.assertIsInstance(inc, scale.ScaleButton) self.assertEqual(inc.get_icon_name(), "list-add-symbolic") inc.emit("clicked") self.assertEqual(splus.get_value(), 1) class TestScaleButtonBox(unittest.TestCase): def test_scale_button_box(self): splus = scale.ScalePlus(0, 5, 1, 1) sbox = scale.ScaleButtonBox(splus) self.assertIsInstance(sbox, Gtk.Box) self.assertEqual(sbox.get_orientation(), Gtk.Orientation.HORIZONTAL) self.assertIsInstance(sbox.get_first_child(), scale.DecrementButton) self.assertIsInstance(sbox.get_last_child(), scale.IncrementButton) self.assertIsInstance(splus.get_next_sibling(), scale.IncrementButton)