15b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass/*
25b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * Copyright (C) 2017 The Android Open Source Project
35b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass *
45b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * Licensed under the Apache License, Version 2.0 (the "License");
55b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * you may not use this file except in compliance with the License.
65b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * You may obtain a copy of the License at
75b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass *
85b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass *      http://www.apache.org/licenses/LICENSE-2.0
95b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass *
105b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * Unless required by applicable law or agreed to in writing, software
115b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * distributed under the License is distributed on an "AS IS" BASIS,
125b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * See the License for the specific language governing permissions and
145b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * limitations under the License.
155b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass */
165b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
175b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plasspackage com.android.server.wifi.util;
185b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
195b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plassimport static org.junit.Assert.assertEquals;
205b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
215b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plassimport org.junit.Test;
225b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
235b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plassimport java.util.Random;
245b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
255b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass/**
265b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass * Unit tests for {@link com.android.server.wifi.util.Matrix}.
275b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass */
285b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plasspublic class MatrixTest {
295b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
305b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test that both forms of constructor work
315b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
325b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test
335b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testConstructors() throws Exception {
345b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(new Matrix(3, 2), new Matrix(2, new double[]{0, 0, 0, 0, 0, 0}));
355b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
365b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
375b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
385b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test some degenerate cases
395b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
405b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test
415b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testDegenerate() throws Exception {
425b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m1 = new Matrix(0, 20);
435b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m2 = new Matrix(20, 0);
445b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(m1, m2.transpose());
455b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
465b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
475b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
485b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test addition
495b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
505b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test
515b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testAddition() throws Exception {
525b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m1 = new Matrix(2, new double[]{1, 2, 3, 4});
535b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m2 = new Matrix(2, new double[]{10, 20, 30, 40});
545b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m3 = new Matrix(2, new double[]{11, 22, 33, 44});
555b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(m3, m1.plus(m2));
565b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
575b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
585b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
595b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test subtraction.
605b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
615b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test
625b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testSubtraction() throws Exception {
635b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m1 = new Matrix(2, new double[]{1, 2, 3, 4});
645b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m2 = new Matrix(2, new double[]{10, 20, 30, 40});
655b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m3 = new Matrix(2, new double[]{11, 22, 33, 44});
665b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(m1, m3.minus(m2));
675b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
685b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
695b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
705b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test multiplication.
715b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
725b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test
735b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testMultiplication() throws Exception {
745b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m1 = new Matrix(2, new double[]{1, 2, 3, 4});
755b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m2 = new Matrix(2, new double[]{-3, 3, 7, 1});
765b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m3 = new Matrix(2, new double[]{11, 5, 19, 13});
775b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(m3, m1.dot(m2));
785b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
795b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
805b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
815b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test that matrix inverse works (non-singular case).
825b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
835b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test
845b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testInverse() throws Exception {
855b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix i3 = new Matrix(3, new double[]{1, 0, 0, 0, 1, 0, 0, 0, 1});
865b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix f = new Matrix(3, new double[]{100, 100, 100, 100, 100, 100, 100, 100, 100});
875b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m1 = new Matrix(3, new double[]{10, 1, -1, 2, 14, -1, 0, 2, 20});
885b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m2 = m1.inverse();
895b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m12 = m1.dot(m2);
905b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m21 = m2.dot(m1);
915b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        // Add f here to wash out the roundoff errors
925b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(i3.plus(f), m12.plus(f));
935b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(i3.plus(f), m21.plus(f));
945b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
955b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
965b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
975b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test that attempting to invert a singular matrix throws an exception.
985b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * @throws Exception
995b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
1005b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test(expected = ArithmeticException.class)
1015b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testSingularity() throws Exception {
1025b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m1 = new Matrix(3, new double[]{10, 1, -1, 0, 0, 0, 0, 0, 0});
1035b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m2 = m1.inverse();
1045b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
1055b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass
1065b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    /**
1075b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * Test that a copy is equal to the original, and that hash codes match,
1085b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     * and that string versions match.
1095b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass     */
1105b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    @Test
1115b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    public void testCopy() throws Exception {
1125b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Random random = new Random();
1135b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m1 = new Matrix(3, 4);
1145b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        for (int i = 0; i < m1.mem.length; i++) {
1155b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass            m1.mem[i] = random.nextDouble();
1165b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        }
1175b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        Matrix m2 = new Matrix(m1);
1185b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(m1, m2);
1195b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(m1.hashCode(), m2.hashCode());
1205b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass        assertEquals(m1.toString(), m2.toString());
1215b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass    }
1225b0fa1e4851b9f4a8fd8efe7afa89b575be727bdMichael Plass}
123