import unittest
from Numeric import *
from Matrix import *
from LuDecomposition import *

class TestLuDecomposition(unittest.TestCase):
        def setUp(self):
                self.a = [[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]
                self.matrixA = Matrix(array(self.a))

        def testLwrite(self):
                ld = LuDecomposition(self.a)
                col = 0
                ld._writeL(col)
                self.assertEquals(ld._getL(), [[1,0,0],[4,0,0],[7,0,0]])

        def testUwrite(self):
                ld = LuDecomposition(self.a)
                col = 0
                ld._writeL(col)
                row = 0
                ld._writeU(row)
                self.assertEquals(ld._getU(), [[1,2.0,3.0],[0,1,0], [0,0,1]])

        def testLuDecMore(self):
                ld = LuDecomposition(self.a)
                ld._writeL(0)
                ld._writeU(0)
                self.assertEquals(ld._getL(), [[1,0,0],[4,0,0],[7,0,0]])
                self.assertEquals(ld._getU(), [[1,2,3],[0,1,0], [0,0,1]])
                ld._writeL(1)
                ld._writeU(1)
                self.assertEquals(ld._getL(), [[1,0,0],[4,-3,0],[7,-6,0]])
                self.assertEquals(ld._getU(), [[1,2,3],[0,1,2], [0,0,1]])
                ld._writeL(2)
                ld._writeU(2)
                self.assertEquals(ld._getL(), [[1,0,0],[4,-3,0],[7,-6,0]])
                self.assertEquals(ld._getU(), [[1,2,3],[0,1,2], [0,0,1]])

        def testLuDecomposition(self):
                l, u = LuDecomposition(self.a).perform()
                matrixL = Matrix(array(l))
                matrixU = Matrix(array(u))
                actual = matrixL * matrixU
                self.assertEquals(str(actual), str(self.matrixA))


if __name__=="__main__":
        unittest.main()