# 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)
 
