tests/testthat/test-makefile.R

source('sanitizeCovr.R')

test_that('1 rule makefile', {
  job <- list(rule(target='target.Rdata', depends=c('dep1', 'dep2'), build='buildCmd', clean='cleanCmd'))
  res <- makefile(job, fileName=NULL)

  res <- sanitizeCovr(res)
  res <- res[-seq_len(which(res == ''))]
  expect_equal(res, c('.PHONY: all',
                      'all: Makefile target.Rdata',
                      '\t',
                      'target.Rdata: dep1 dep2',
                      '\tbuildCmd',
                      '.PHONY: clean',
                      'clean: ',
                      '\tcleanCmd',
                      'Makefile: Makefile.R',
                      '\t$(R) -e \'{\' \\',
                      ifelse(getRversion() > '3.4.4',
                             '\t-e \'    params <- list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\")\' \\',
                             '\t-e \'    params <- structure(list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\"), .Names = c(\".target\", \".script\", \".depends\", \".task\"))\' \\'),
                      '\t-e \'    source("Makefile.R")\' \\',
                      '\t-e \'}\''))
})

test_that('not all in makefile', {
  job <- list(rule(target='target.Rdata', depends=c('dep1', 'dep2'), build='buildCmd', clean='cleanCmd'))
  res <- makefile(job, fileName=NULL, all=FALSE)
  res <- sanitizeCovr(res)
  res <- res[-seq_len(which(res == ''))]
  expect_equal(res, c('target.Rdata: dep1 dep2',
                      '\tbuildCmd',
                      '.PHONY: clean',
                      'clean: ',
                      '\tcleanCmd',
                      'Makefile: Makefile.R',
                      '\t$(R) -e \'{\' \\',
                      ifelse(getRversion() > '3.4.4',
                             '\t-e \'    params <- list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\")\' \\',
                             '\t-e \'    params <- structure(list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\"), .Names = c(\".target\", \".script\", \".depends\", \".task\"))\' \\'),
                      '\t-e \'    source("Makefile.R")\' \\',
                      '\t-e \'}\''))
})

test_that('not clean in makefile', {
  job <- list(rule(target='target.Rdata', depends=c('dep1', 'dep2'), build='buildCmd', clean='cleanCmd'))
  res <- makefile(job, fileName=NULL, clean=FALSE)
  res <- sanitizeCovr(res)
  res <- res[-seq_len(which(res == ''))]
  expect_equal(res, c('.PHONY: all',
                      'all: Makefile target.Rdata',
                      '\t',
                      'target.Rdata: dep1 dep2',
                      '\tbuildCmd',
                      'Makefile: Makefile.R',
                      '\t$(R) -e \'{\' \\',
                      ifelse(getRversion() > '3.4.4',
                             '\t-e \'    params <- list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\")\' \\',
                             '\t-e \'    params <- structure(list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\"), .Names = c(\".target\", \".script\", \".depends\", \".task\"))\' \\'),
                      '\t-e \'    source("Makefile.R")\' \\',
                      '\t-e \'}\''))
})

test_that('not Makefile in makefile', {
  job <- list(rule(target='target.Rdata', depends=c('dep1', 'dep2'), build='buildCmd', clean='cleanCmd'))
  res <- makefile(job, fileName=NULL, makefile=FALSE)
  res <- sanitizeCovr(res)
  res <- res[-seq_len(which(res == ''))]
  expect_equal(res, c('.PHONY: all',
                      'all: target.Rdata',
                      '\t',
                      'target.Rdata: dep1 dep2',
                      '\tbuildCmd',
                      '.PHONY: clean',
                      'clean: ',
                      '\tcleanCmd'))
})

test_that('custom vars in makefile', {
  job <- list(rule(target='target.Rdata', depends=c('dep1', 'dep2'), build='buildCmd', clean='cleanCmd'))
  res <- makefile(job, fileName=NULL, vars=c(CPP='gcc'))
  res <- sanitizeCovr(res)
  res <- res[seq_len(which(res == ''))]
  if (.Platform$OS.type == 'unix') {
    expect_equal(res, c('# Generated by rmake: do not edit by hand',
                        'SHELL=/bin/sh',
                        'R="$(R_HOME)/bin$(R_ARCH)/Rscript"',
                        'RM=rm',
                        'CP=cp',
                        'CPP=gcc',
                        ''))
  } else {
    expect_equal(res, c('# Generated by rmake: do not edit by hand',
                        'SHELL=/bin/sh',
                        'R="$(R_HOME)/bin$(R_ARCH)/Rscript"',
                        'RM=cmd //C del',
                        'CP=cmd //C copy',
                        'CPP=gcc',
                        ''))
  }
})


test_that('redefined vars in makefile', {
  job <- list(rule(target='target.Rdata', depends=c('dep1', 'dep2'), build='buildCmd', clean='cleanCmd'))
  res <- makefile(job, fileName=NULL, vars=c(R='MyR', CPP='gcc'))
  res <- sanitizeCovr(res)
  res <- res[seq_len(which(res == ''))]
  if (.Platform$OS.type == 'unix') {
    expect_equal(res, c('# Generated by rmake: do not edit by hand',
                        'SHELL=/bin/sh',
                        'R=MyR',
                        'RM=rm',
                        'CP=cp',
                        'CPP=gcc',
                        ''))
  } else {
    expect_equal(res, c('# Generated by rmake: do not edit by hand',
                        'SHELL=/bin/sh',
                        'R=MyR',
                        'RM=cmd //C del',
                        'CP=cmd //C copy',
                        'CPP=gcc',
                        ''))
  }
})

test_that('multiple target rule makefile', {
  job <- list(rule(target=c('target.pdf', 'target.docx'),
                     depends=c('dep1', 'dep2'),
                     build='buildCmd',
                     clean='cleanCmd'))
  res <- makefile(job, fileName=NULL)
  res <- sanitizeCovr(res)
  res <- res[-seq_len(which(res == ''))]
  expect_equal(res, c('.PHONY: all',
                      'all: Makefile target.pdf target.docx',
                      '\t',
                      'target%pdf target%docx: dep1 dep2',
                      '\tbuildCmd',
                      '.PHONY: clean',
                      'clean: ',
                      '\tcleanCmd',
                      'Makefile: Makefile.R',
                      '\t$(R) -e \'{\' \\',
                      ifelse(getRversion() > '3.4.4',
                             '\t-e \'    params <- list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\")\' \\',
                             '\t-e \'    params <- structure(list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\"), .Names = c(\".target\", \".script\", \".depends\", \".task\"))\' \\'),
                      '\t-e \'    source("Makefile.R")\' \\',
                      '\t-e \'}\''))
})

test_that('makefile with tasks', {
  job <- list(rule(target=c('target1.pdf', 'target1.docx'),
                     depends=c('dep1.1', 'dep1.2'),
                     build='buildCmd1',
                     clean='cleanCmd1',
                     task='task1'),
              rule(target=c('target2.pdf', 'target2.docx'),
                     depends=c('dep2.1', 'dep2.2'),
                     build='buildCmd2',
                     clean='cleanCmd2',
                     task='task2'),
              rule(target=c('target3.pdf', 'target3.docx'),
                     depends=c('dep3.1', 'dep3.2'),
                     build='buildCmd3',
                     clean='cleanCmd3'))
  res <- makefile(job, fileName=NULL)
  res <- sanitizeCovr(res)
  res <- res[-seq_len(which(res == ''))]
  expect_equal(res, c('.PHONY: all',
                      'all: Makefile task1 task2 target3.pdf target3.docx',
                      '\t',
                      '.PHONY: task1',
                      'task1: Makefile target1.pdf target1.docx',
                      '\t',
                      '.PHONY: task2',
                      'task2: Makefile target2.pdf target2.docx',
                      '\t',
                      'target1%pdf target1%docx: dep1.1 dep1.2',
                      '\tbuildCmd1',
                      'target2%pdf target2%docx: dep2.1 dep2.2',
                      '\tbuildCmd2',
                      'target3%pdf target3%docx: dep3.1 dep3.2',
                      '\tbuildCmd3',
                      '.PHONY: clean',
                      'clean: ',
                      '\tcleanCmd1',
                      '\tcleanCmd2',
                      '\tcleanCmd3',
                      '.PHONY: clean_task1',
                      'clean_task1: ',
                      '\tcleanCmd1',
                      '.PHONY: clean_task2',
                      'clean_task2: ',
                      '\tcleanCmd2',
                      'Makefile: Makefile.R',
                      '\t$(R) -e \'{\' \\',
                      ifelse(getRversion() > '3.4.4',
                             '\t-e \'    params <- list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\")\' \\',
                             '\t-e \'    params <- structure(list(.target = \"Makefile\", .script = \"Makefile.R\", .depends = NULL, .task = \"all\"), .Names = c(\".target\", \".script\", \".depends\", \".task\"))\' \\'),
                      '\t-e \'    source("Makefile.R")\' \\',
                      '\t-e \'}\''))
})


test_that('error on unevaluated variables', {
  job <- 'data-$[VAR].csv' %>>% rRule('script.R') %>>% 'result.csv'
  expect_error(makefile(job))
})


test_that('error on non-unique targets', {
  job <- c('data.csv' %>>% rRule('script.R') %>>% 'result.csv',
           'data2.csv' %>>% rRule('script2.R') %>>% 'result.csv')
  expect_error(makefile(job))
})


test_that('duplicate rules are ignored', {
  job <- c('data.csv' %>>% rRule('script.R') %>>% 'result.csv',
           'data.csv' %>>% rRule('script.R') %>>% 'result.csv')
  expect_silent(out <- makefile(job))
})
beerda/rmake documentation built on July 2, 2022, 6:24 p.m.