# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#
#------------------------------------------------------------------------------
# R source file to validate ChiSquare tests in
# org.apache.commons.math.stat.inference.ChiSquareTestTest
#
# To run the test, install R, put this file and testFunctions
# into the same directory, launch R from this directory and then enter
# source("<name-of-this-file>")
#
# R functions used
#chisq.test(x, y = NULL, correct = TRUE,
#           p = rep(1/length(x), length(x)),
#           simulate.p.value = FALSE, B = 2000)
#------------------------------------------------------------------------------
tol <- 1E-9                     # error tolerance for tests
#------------------------------------------------------------------------------
# Function definitions

source("testFunctions")           # utility test functions

verifyTable <- function(counts, expectedP, expectedStat, tol, desc) {
    results <- chisq.test(counts)
    if (assertEquals(expectedP, results$p.value, tol, "p-value")) {
        displayPadded(c(desc," p-value test"), SUCCEEDED, WIDTH)
    } else {
        displayPadded(c(desc, " p-value test"), FAILED, WIDTH)
    }
    if (assertEquals(expectedStat, results$statistic, tol,
       "ChiSquare Statistic")) {
        displayPadded(c(desc, " chi-square statistic test"), SUCCEEDED, WIDTH)
    } else {
        displayPadded(c(desc, " chi-square statistic test"), FAILED, WIDTH)
    }
}

verifyHomogeneity <- function(obs, exp, expectedP, expectedStat,
  tol, desc) {
    results <- chisq.test(obs,p=exp,rescale.p=TRUE)
    chi <- results$statistic
    p <- results$p.value
    if (assertEquals(expectedP, p, tol, "p-value")) {
        displayPadded(c(desc, " p-value test"), SUCCEEDED, WIDTH)
    } else {
        displayPadded(c(desc, " p-value test"), FAILED, WIDTH)
    }
    if (assertEquals(expectedStat, chi, tol,
       "ChiSquare Statistic")) {
        displayPadded(c(desc, " chi-square statistic test"), SUCCEEDED, WIDTH)
    } else {
        displayPadded(c(desc, " chi-square statistic test"), FAILED, WIDTH)
    }
}

cat("ChiSquareTest test cases\n")

observed <- c(10, 9, 11)
expected <- c(10, 10, 10)
verifyHomogeneity(observed, expected, 0.904837418036, 0.2, tol,
   "testChiSquare1")

observed <- c(500, 623, 72, 70, 31)
expected <- c(485, 541, 82, 61, 37)
verifyHomogeneity(observed, expected, 0.06051952647453607, 9.023307936427388,
   tol, "testChiSquare2")

observed <- c(2372383, 584222, 257170, 17750155, 7903832, 489265,
              209628, 393899)
expected <- c(3389119.5, 649136.6, 285745.4, 25357364.76, 11291189.78,
              543628.0, 232921.0, 437665.75)
verifyHomogeneity(observed, expected, 0, 114875.90421929007, tol,
   "testChiSquareLargeTestStatistic")

counts <- matrix(c(40, 22, 43, 91, 21, 28, 60, 10, 22), nc = 3);
verifyTable(counts, 0.000144751460134, 22.709027688, tol,
   "testChiSquareIndependence1")

counts <- matrix(c(10, 15, 30, 40, 60, 90), nc = 3);
verifyTable(counts, 0.918987499852, 0.168965517241, tol,
   "testChiSquareIndependence2")

counts <- matrix(c(40, 0, 4, 91, 1, 2, 60, 2, 0), nc = 3);
verifyTable(counts, 0.0462835770603, 9.67444662263, tol,
  "testChiSquareZeroCount")

displayDashes(WIDTH)


