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