/*******************************************************************************
* Copyright 2014 Felipe Takiyama
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package br.usp.poli.takiyama.utils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import br.usp.poli.takiyama.utils.MathUtils.Multinomial;
import static br.usp.poli.takiyama.utils.MathUtils.*;
import static org.junit.Assert.*;
public class MathUtilsTest {
/**
* Calculates multinomial(). Result is 1
*/
@Test
public void testMultinomialEmpty() {
List<Integer> m = new ArrayList<Integer>(1);
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(1);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(0). Result is 1
*/
@Test
public void testMultinomial0() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(0));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(1);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(1). Result is 1
*/
@Test
public void testMultinomial1() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(1));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(1);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(1, 1). Result is 2
*/
@Test
public void testMultinomial1_1() {
List<Integer> m = new ArrayList<Integer>(2);
m.add(Integer.valueOf(1));
m.add(Integer.valueOf(1));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(2);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(1,1,1). Result is 6
*/
@Test
public void testMultinomial1_1_1() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(1));
m.add(Integer.valueOf(1));
m.add(Integer.valueOf(1));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(6);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(3,2). Result is 10
*/
@Test
public void testMultinomial3_2() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(3));
m.add(Integer.valueOf(2));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(10);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(1,1,1,1). Result is 24
*/
@Test
public void testMultinomial1_1_1_1() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(1));
m.add(Integer.valueOf(1));
m.add(Integer.valueOf(1));
m.add(Integer.valueOf(1));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(24);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(3,2,1). Result is 60
*/
@Test
public void testMultinomial3_2_1() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(3));
m.add(Integer.valueOf(2));
m.add(Integer.valueOf(1));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(60);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(7,4,2). Result is 25740.
* This test fails when using the traditional approach (causes overflow).
*/
@Test
public void testMultinomial7_4_2() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(7));
m.add(Integer.valueOf(4));
m.add(Integer.valueOf(2));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(25740);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(9,8,4). Result is 145,495,350.
* This test fails when using the traditional approach (causes overflow),
* even if we use 64 bit integers.
*/
@Test
public void testMultinomial9_8_4() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(9));
m.add(Integer.valueOf(8));
m.add(Integer.valueOf(4));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(145495350);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(10000,0). Result is 1.
*/
@Test
public void testMultinomial10000() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(10000));
m.add(Integer.valueOf(0));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(1);
assertTrue(result.equals(answer));
}
/**
* Calculates multinomial(0,2). Result is 1.
*/
@Test
public void testMultinomial0_2() {
List<Integer> m = new ArrayList<Integer>(1);
m.add(Integer.valueOf(0));
m.add(Integer.valueOf(2));
Multinomial mul = Multinomial.getInstance(m);
BigInteger result = multinomial(mul);
BigInteger answer = BigInteger.valueOf(1);
assertTrue(result.equals(answer));
}
/**
* Calculates 0^0 = 1.
*/
@Test
public void testPow0_0() {
BigDecimal base = new BigDecimal(0);
int p = 0;
int q = 1;
BigDecimal result = pow(base, p, q);
BigDecimal answer = BigDecimal.ONE;
assertTrue(result.equals(answer));
}
/**
* Calculates 0^3 = 0.
*/
@Test
public void testPow0_positiveNumber() {
BigDecimal base = new BigDecimal(0);
int p = 3;
int q = 1;
BigDecimal result = pow(base, p, q);
BigDecimal answer = BigDecimal.ZERO;
assertTrue(result.equals(answer));
}
/**
* Calculates 0^-3. Must throw an exception.
*/
@Test(expected=IllegalArgumentException.class)
public void testPow0_negativeNumber() {
BigDecimal base = new BigDecimal(0);
int p = -3;
int q = 1;
pow(base, p, q);
}
/**
* Calculates -2^3. Must throw an exception.
*/
@Test(expected=IllegalArgumentException.class)
public void testPowMinus2_3() {
BigDecimal base = new BigDecimal(-2);
int p = 3;
int q = 1;
pow(base, p, q);
}
/**
* Calculates 2^(4/2) = 4.
*/
@Test
public void testPow2_2() {
BigDecimal base = new BigDecimal(2);
int p = 4;
int q = 2;
BigDecimal result = pow(base, p, q);
BigDecimal answer = new BigDecimal(4);
assertTrue(result.equals(answer));
}
/**
* Calculates 4^(1/2) = 2.
*/
@Test
public void testSqrt4() {
BigDecimal base = new BigDecimal(4);
int p = 1;
int q = 2;
BigDecimal result = pow(base, p, q);
BigDecimal answer = new BigDecimal(2);
assertTrue(result.equals(answer));
}
}