### Regression tests for which the printed output is the issue
### May fail.
### Skipped on a Unix-alike without Recommended packages

pdf("reg-tests-3.pdf", encoding = "ISOLatin1.enc")

## str() for character & factors with NA (levels), and for Surv objects:
ff <- factor(c(2:1,  NA),  exclude = NULL)
str(levels(ff))
str(ff)
str(ordered(ff, exclude=NULL))
if(require(survival)) {
    (sa <- Surv(aml$time, aml$status))
    str(sa)
    detach("package:survival", unload = TRUE)
}
## were different, the last one failed in 1.6.2 (at least)


## lm.influence where hat[1] == 1
if(require(MASS)) {
    fit <- lm(formula = 1000/MPG.city ~ Weight + Cylinders + Type + EngineSize + DriveTrain, data = Cars93)
    print(lm.influence(fit))
    ## row 57 should have hat = 1 and resid=0.
    summary(influence.measures(fit))
}
## only last two cols in row 57 should be influential


## PR#6640  Zero weights in plot.lm
if(require(MASS)) {
    fm1 <- lm(time~dist, data=hills, weights=c(0,0,rep(1,33)))
    plot(fm1)
}
## gave warnings in 1.8.1


## PR#7829 model.tables & replications
if(require(MASS)) {
    oats.aov <- aov(Y ~ B + V + N + V:N, data=oats[-1,])
    model.tables(oats.aov, "means", cterms=c("N", "V:N"))
}
## wrong printed output in 2.1.0


## drop1 on weighted lm() fits
if(require(MASS)) {
    hills.lm <- lm(time ~ 0 + dist + climb, data=hills, weights=1/dist^2)
    print(drop1(hills.lm))
    print(stats:::drop1.default(hills.lm))
    hills.lm2 <- lm(time/dist ~ 1 + I(climb/dist), data=hills)
    drop1(hills.lm2)
}
## quoted unweighted RSS etc in 2.2.1


## tests of ISO C99 compliance (Windows fails without a workaround)
sprintf("%g", 123456789)
sprintf("%8g", 123456789)
sprintf("%9.7g", 123456789)
sprintf("%10.9g", 123456789)
sprintf("%g", 12345.6789)
sprintf("%10.9g", 12345.6789)
sprintf("%10.7g", 12345.6789)
sprintf("%.7g", 12345.6789)
sprintf("%.5g", 12345.6789)
sprintf("%.4g", 12345.6789)
sprintf("%9.4g", 12345.6789)
sprintf("%10.4g", 12345.6789)
## Windows used e+008 etc prior to 2.3.0


## weighted glm() fits
if(require(MASS)) {
    hills.glm <- glm(time ~ 0 + dist + climb, data=hills, weights=1/dist^2)
    print(AIC(hills.glm))
    print(extractAIC(hills.glm))
    print(drop1(hills.glm))
    stats:::drop1.default(hills.glm)
}
## wrong AIC() and drop1 prior to 2.3.0.

## calculating no of signif digits
print(1.001, digits=16)
## 2.4.1 gave  1.001000000000000
## 2.5.0 errs on the side of caution.


## as.matrix.data.frame with coercion
if(require("survival")) {
    soa <- Surv(1:5, c(0, 0, 1, 0, 1))
    df.soa <- data.frame(soa)
    print(as.matrix(df.soa)) # numeric result
    df.soac <- data.frame(soa, letters[1:5])
    print(as.matrix(df.soac)) # character result
    detach("package:survival", unload = TRUE)
}
## failed in 2.8.1

## wish of PR#13505
npk.aov <- aov(yield ~ block + N * P + K, npk)
foo <- proj(npk.aov)
cbind(npk, foo)
## failed in R < 2.10.0


if(suppressMessages(require("Matrix", .Library))) {
  print(cS. <- contr.SAS(5, sparse = TRUE))
  stopifnot(all(contr.SAS(5) == cS.),
	    all(contr.helmert(5, sparse = TRUE) == contr.helmert(5)))

  x1 <- x2 <- c('a','b','a','b','c')
  x3 <- x2; x3[4:5] <- x2[5:4]
  print(xtabs(~ x1 + x2, sparse= TRUE, exclude = 'c'))
  print(xtabs(~ x1 + x3, sparse= TRUE, exclude = 'c'))
  detach("package:Matrix")
  ## failed in R <= 2.13.1
}

## regression tests for dimnames (broken on 2009-07-31)
contr.sum(4)
contr.helmert(4)
contr.sum(2) # needed drop=FALSE at one point.

## xtabs did not exclude levels from factors
x1 <- c('a','b','a','b','c', NA)
x2 <- factor(x1, exclude=NULL)
print(xtabs(~ x1 + x2, na.action = na.pass))
print(xtabs(~ x1 + x2, exclude = 'c', na.action = na.pass))


## median should work by default for a suitable S4 class.
## adapted from adaptsmoFMRI
if(suppressMessages(require("Matrix", .Library))) {
    x <- matrix(c(1,2,3,4))
    print(m <- median(x))
    stopifnot(all.equal(m, median(as(x, "denseMatrix"))))
    detach("package:Matrix")
}

## Various arguments were not duplicated:  PR#15352 to 15354
x <- 5
y <- 2
f <- function (y) x
numericDeriv(f(y),"y")
x

a<-list(1,2)
b<-rep.int(a,c(2,2))
b[[1]][1]<-9
a[[1]]

a <- numeric(1)
x <- mget("a",as.environment(1))
x
a[1] <- 9
x


## needs MASS installed
## PR#2586 labelling in alias()
if(require("MASS")) {
    Y <- c(0,1,2)
    X1 <- c(0,1,0)
    X2 <- c(0,1,0)
    X3 <- c(0,0,1)
    print(res <- alias(lm(Y ~ X1 + X2 + X3)))
    stopifnot(identical(rownames(res[[2]]), "X2"))
}
## the error was in lm.(w)fit

if(require("Matrix", .Library)) {
 m1 <- m2 <- m <- matrix(1:12, 3,4)
 dimnames(m2) <- list(LETTERS[1:3],
                      letters[1:4])
 dimnames(m1) <- list(NULL,letters[1:4])
 M  <- Matrix(m)
 M1 <- Matrix(m1)
 M2 <- Matrix(m2)
 ## Now, with a new ideal cbind(), rbind():
 print(cbind(M, M1))
 stopifnot(identical(cbind (M, M1),
                     cbind2(M, M1)))
 rm(M,M1,M2)
 detach("package:Matrix", unload=TRUE)
}##{Matrix}


## Invalid UTF-8 strings
x <- c("Jetz", "no", "chli", "z\xc3\xbcrit\xc3\xbc\xc3\xbctsch:",
       "(noch", "ein", "bi\xc3\x9fchen", "Z\xc3\xbc", "deutsch)",
       "\xfa\xb4\xbf\xbf\x9f")
lapply(x, utf8ToInt)
Encoding(x) <- "UTF-8"
nchar(x, "b")
try(nchar(x, "c"))
try(nchar(x, "w"))
nchar(x, "c", allowNA = TRUE)
nchar(x, "w", allowNA = TRUE)
## Results differed by platform, but some gave incorrect results on string 10.


## str() on large strings
nchar(L <- strrep(paste(LETTERS, collapse="."), 100000), type="b") # 5.1 M
str(L)


if(require("Matrix", .Library)) {
    M <- Matrix(diag(1:10), sparse=TRUE) # a "ddiMatrix"
    setClass("TestM", slots = c(M='numeric'))
    setMethod("+", c("TestM","TestM"), function(e1,e2) {
        e1@M + e2@M
    })
    M+M # works the first time
    M+M # was error   "object '.Generic' not found"
    ##
    as.Matrix <- if(packageVersion("Matrix", .Library) >= "1.4.2") {
                     as.matrix
                 } else function(x) `dimnames<-`(as.matrix(x), list(NULL,NULL))
    stopifnot(exprs = {
        identical(pmin(2,M), pmin(2, as.matrix(M)))
        identical(as.matrix(pmax(M, 7)),
                  pmax(as.Matrix(M), 7))
    })
    rm(M)

    ## show(<S4 generic>) from base
    show(chol2inv) # last line now has .. showMethods(chol2inv) ..

    detach("package:Matrix", unload=TRUE)
}##{Matrix}

## citation() / bibentry
options(width=88) # format.bibentry() using strwrap()
c1 <- citation()
c1$year <- "9999" # avoid tedious updates of reference output
print(c1)
fc1B <- format(c1)
fc1N <- format(c1, bibtex=FALSE)
stopifnot(exprs = {
    identical(fc1B[-2], fc1N[-2])
    (b2 <- fc1B[2]) != (n2 <- fc1N[2]) # bibtex left away (at end of line 2)
    startsWith(b2, n2)
})

pkg <- "nlme"
(hasME <- requireNamespace(pkg, quietly=TRUE, lib.loc = .Library))
if(hasME) withAutoprint({
    c2 <- citation(pkg, .Library)
    ## avoid spurious diffs:
    c2$author[[1]]$given[[1]] <- "J."
    c2$year[[1]] <- "9999"
    c2$note[[1]] <- sub("3.1-[0-9]*$", "3.1-999", c2$note[[1]])
    print(c2)
    print(c2, bibtex=FALSE) # no final message
    print(c2, bibtex=TRUE)  # w/ two bibTeX
    stopifnot(length(c2) >= 2)
    f2N <- format(c2) # -> format.bibentry(*, style="citation")
    f2B <- format(c2, bibtex=TRUE)
    stopifnot(exprs = {
        print(n <- length(f2N)) == length(f2B)
        identical(f2N[1], f2B[1])
        grepl("see these entries in BibTeX",       f2N[n], fixed=TRUE)
        grepl("'format(<citation>, bibtex=TRUE)'", f2N[n], fixed=TRUE) # "format(..)" was "print(..)"
        f2B[n] == ""
        (ie <- -c(1,n)) < 0
        grepl("A BibTeX entry ", f2B[ie], fixed=TRUE)
        grepl(" @[A-Z]", f2B[ie]) # @Book etc
       !grepl(" @[A-Z]", f2N[ie]) # *not* there
        nchar(f2N[ie]) < nchar(f2B[ie])
        startsWith(f2B[ie], f2N[ie])
      })

    desc <- packageDescription(pkg, .Library)
    desc$URL <- paste(URL1 <- "https://example.org",
                      "https://example.com", sep = "\n") # via continuation line
    desc$Repository <- NULL
    c3 <- citation(auto = desc)
    stopifnot(identical(print(c3$url), URL1)) # R <= 4.4.0 gave both URLs

    unloadNamespace(pkg)
})



cat('Time elapsed: ', proc.time(),'\n')
