# problem2solutiontests.py
#
# ICS H32 Fall 2025
# Exercise Set 6
# INSTRUCTOR SOLUTION
#
# These are unit tests for the reverse_transpose and calculate_sums
# functions.  Note that there's a lot of attention paid to boundary
# cases (e.g., a single row, a single column, jagged matrices, and
# so on).  That's where a lot of the mistakes can be made in problems
# like these.

from problem2solution import reverse_transpose, calculate_sums
import unittest



class ReverseTransposeTest(unittest.TestCase):
    def test_square_matrix(self):
        result = reverse_transpose([['x', 'y', 'z'], ['w', 'v', 't'], ['p', 'r', 's']])
        self.assertEqual([['s', 't', 'z'], ['r', 'v', 'y'], ['p', 'w', 'x']], result)


    def test_more_rows_than_columns(self):
        result = reverse_transpose([['a', 'b', 'c'], ['d', 'e', 'f']])
        self.assertEqual([['f', 'c'], ['e', 'b'], ['d', 'a']], result)


    def test_more_columns_than_rows(self):
        result = reverse_transpose([['a', 'b'], ['c', 'd'], ['e', 'f']])
        self.assertEqual([['f', 'd', 'b'], ['e', 'c', 'a']], result)


    def test_one_row(self):
        result = reverse_transpose([['a', 'b', 'c', 'd', 'e']])
        self.assertEqual([['e'], ['d'], ['c'], ['b'], ['a']], result)


    def test_one_column(self):
        result = reverse_transpose([['a'], ['b'], ['c'], ['d']])
        self.assertEqual([['d', 'c', 'b', 'a']], result)



class CalculateSumsTest(unittest.TestCase):
    def test_square_matrix(self):
        a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
        calculate_sums(a)
        self.assertEqual([[45, 33, 18], [39, 28, 15], [24, 17, 9]], a)


    def test_jagged_matrix(self):
        a = [[1, 2, 3, 4], [5, 6], [7, 8, 9], [10], [11, 12, 13, 14, 15]]
        calculate_sums(a)
        self.assertEqual([[57, 23, 7, 4], [47, 14], [45, 17, 9], [21], [65, 54, 42, 29, 15]], a)


    def test_jagged_short_long(self):
        a = [[1, 2, 3, 4], [5], [6, 7, 8, 9]]
        calculate_sums(a)
        self.assertEqual([[45, 33, 24, 13], [35], [6, 7, 8, 9]], a)


    def test_one_row(self):
        a = [[1, 2, 3, 4, 5, 6, 7]]
        calculate_sums(a)
        self.assertEqual([[28, 27, 25, 22, 18, 13, 7]], a)


    def test_one_column(self):
        a = [[1], [2], [3], [4], [5], [6], [7]]
        calculate_sums(a)
        self.assertEqual([[28], [27], [25], [22], [18], [13], [7]], a)


    def test_empty_rows(self):
        a = [[], [], [], []]
        calculate_sums(a)
        self.assertEqual([[], [], [], []], a)


    def test_empty(self):
        a = []
        calculate_sums(a)
        self.assertEqual([], a)



if __name__ == '__main__':
    unittest.main()

