# test_myrange.py
#
# ICS 33 Spring 2026
# Code Example
#
# Unit tests for the myrange module

from myrange import *
import unittest



class MyRangeInitializationTest(unittest.TestCase):
    def test_cannot_create_with_non_integer_start(self):
        with self.assertRaises(TypeError):
            MyRange('A')


    def test_cannot_create_with_non_integer_stop(self):
        with self.assertRaises(TypeError):
            MyRange(1, 'B')


    def test_cannot_create_with_non_integer_step(self):
        with self.assertRaises(TypeError):
            MyRange(1, 17, 'C')


    def test_start_and_step_are_defaulted_when_only_stop_is_given(self):
        r = MyRange(10)
        self.assertEqual(r.start(), 0)
        self.assertEqual(r.stop(), 10)
        self.assertEqual(r.step(), 1)


    def test_step_is_defaulted_when_only_start_and_stop_are_given(self):
        r = MyRange(11, 17)
        self.assertEqual(r.start(), 11)
        self.assertEqual(r.stop(), 17)
        self.assertEqual(r.step(), 1)


    def test_no_defaults_when_all_arguments_are_given(self):
        r = MyRange(1, 17, 6)
        self.assertEqual(r.start(), 1)
        self.assertEqual(r.stop(), 17)
        self.assertEqual(r.step(), 6)



class MyRangeIterationTest(unittest.TestCase):
    def test_empty_ranges_return_no_values(self):
        values = [x for x in MyRange(11, 11)]
        self.assertEqual(values, [])


    def test_ranges_with_single_elements_return_one_value(self):
        values = [x for x in MyRange(11, 12)]
        self.assertEqual(values, [11])


    def test_default_step_is_respected(self):
        values = [x for x in MyRange(11, 17)]
        self.assertEqual(values, [11, 12, 13, 14, 15, 16])


    def test_non_default_steps_are_respected(self):
        values = [x for x in MyRange(1, 17, 6)]
        self.assertEqual(values, [1, 7, 13])


    def test_iterators_are_iterable(self):
        iterator = iter(MyRange(10))
        values = [x for x in iterator]
        self.assertEqual(values, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])



class MyRangeReprTest(unittest.TestCase):
    def test_repr_includes_all_values_when_all_specified(self):
        value = repr(MyRange(3, 15, 2))
        self.assertEqual(value, 'MyRange(3, 15, 2)')


    def test_repr_includes_start_when_defaulted(self):
        value = repr(MyRange(10))
        self.assertEqual(value, 'MyRange(0, 10)')


    def test_repr_skips_step_when_defaulted(self):
        value = repr(MyRange(3, 15))
        self.assertEqual(value, 'MyRange(3, 15)')


    def test_repr_skips_step_even_if_explicitly_set_to_default(self):
        value = repr(MyRange(3, 15, 1))
        self.assertEqual(value, 'MyRange(3, 15)')



if __name__ == '__main__':
    unittest.main()
