# 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 TTest tests in
# org.apache.commons.math.inference.TTestImpl
#
# 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
# t.test(x, y = NULL, alternative = c("two.sided", "less", "greater"),
# mu = 0, paired = FALSE, var.equal = FALSE, ... )
# Arguments
#   x  a numeric vector of data values.
#   y  an optional numeric vector data values.
#   alternative 	a character string specifying the alternative hypothesis,
#     must be one of "two.sided" (default), "greater" or "less". You can specify
#     just the initial letter.
#   mu  a number indicating the true value of the mean (or difference in means
#      if you are performing a two sample test).
#   paired 	a logical indicating whether you want a paired t-test.
#   var.equal 	a logical variable indicating whether to treat the two
#     variances as being equal.
#     If TRUE then the pooled variance is used to estimate the variance,
#     otherwise the Welch (or Satterthwaite) approximation to the degrees
#     of freedom is used.
#------------------------------------------------------------------------------
tol <- 1E-10                       # error tolerance for tests
#------------------------------------------------------------------------------
# Function definitions
#------------------------------------------------------------------------------
source("testFunctions")           # utility test functions
#------------------------------------------------------------------------------
# Verification function
#
verifyTest <- function(out,expectedP, expectedT,
  tol) {
  if (assertEquals(expectedP, out$p.value, tol,
     "Ttest p value")) {
     displayPadded(output, SUCCEEDED, 80)
  } else {
     displayPadded(output, FAILED, 80)
  }
  output <- c("t test test statistic")
  if (assertEquals(expectedT, out$statistic, tol,
      "Ttest t statistic")) {
      displayPadded(output, SUCCEEDED, 80)
  } else {
      displayPadded(output, FAILED, 80)
  }
  displayDashes(WIDTH)
}

cat("One-sample, two-sided TTest test cases \n")
sample1 <- c(93.0, 103.0, 95.0, 101.0, 91.0, 105.0, 96.0, 94.0, 101.0,  88.0,
                      98.0, 94.0, 101.0, 92.0, 95.0)
out <- t.test(sample1, mu=100.0)
expectedP <-  0.0136390585873
expectedT<- -2.81976445346
verifyTest(out,expectedP, expectedT, tol)

cat("One-sample, one-sided TTest test cases \n")
sample1 <- c(2, 0, 6, 6, 3, 3, 2, 3, -6, 6, 6, 6, 3, 0, 1, 1, 0, 2, 3, 3)
out <- t.test(sample1, mu=0.0, alternative="g")
expectedP <-  0.000521637019637
expectedT<- 3.86485535541
verifyTest(out,expectedP, expectedT, tol)

cat("Homoscedastic TTest test cases \n")
sample1 <- c(2, 4, 6, 8, 10, 97)
sample2 <- c(4, 6, 8, 10, 16)
out <- t.test(sample1,sample2,var.equal = TRUE)
expectedP <-  0.4833963785
expectedT<- 0.73096310086
verifyTest(out,expectedP, expectedT, tol)

cat("Heteroscedastic TTest test cases \n")
sample1 <- c(7, -4, 18, 17, -3, -5, 1, 10, 11, -2)
sample2 <- c(-1, 12, -1, -3, 3, -5, 5, 2, -11, -1, -3)
out <- t.test(sample1,sample2,var.equal = FALSE)
expectedP <-  0.128839369622
expectedT<- 1.60371728768
verifyTest(out,expectedP, expectedT, tol)

cat("Small sample, heteroscedastic test cases \n")
sample1 <- c(1,3)
sample2 <- c(4,5)
out <- t.test(sample1,sample2,var.equal = FALSE)
expectedP <-  0.198727388935
expectedT<- -2.2360679775
verifyTest(out,expectedP, expectedT, tol)

