.get_srcpkgs <- 
test_that("get_srcpkgs", { 
  setup_temp_dir()
  OLD <- settings()
  on.exit(restore_init(OLD), add = TRUE)
  reset(root = '.')

  ### no pkg yet to be found
  expect_null(find_srcpkgs())
  expect_null(get_srcpkgs())

  ### create a AA package
  pkg_create('.', 'AA', imports = 'stats')
  reset(root = '.')
  ###
  # automatic
  src_pkgs <- find_srcpkgs()
  expect_identical(get_srcpkgs(), src_pkgs)

  ### modify pkg AA
  expect_identical(get_srcpkgs()$AA$imports, 'stats')
  unlink('AA', recursive = TRUE)
  pkg_create('.', 'AA', imports = 'roxygen2')

  expect_identical(get_srcpkgs()$AA$imports, 'roxygen2')

  ### add two packages
  pkg_create('.', 'AB')
  pkg_create('.', 'BB')
  reset()
  src_pkgs <- find_srcpkgs(".")
  expect_identical(get_srcpkgs(), src_pkgs)
  
  expect_identical(get_srcpkgs("AA"), subset_s3_list(src_pkgs, "AA"))
  expect_identical(get_srcpkgs("A"), subset_s3_list(src_pkgs, c("AA", "AB")))
})


.filter_srcpkgs <- 
test_that("filter_srcpkgs", { 
  src_pkgs <- examples_srcpkgs_star()

  expect_identical(filter_srcpkgs(src_pkgs), src_pkgs)
  expect_identical(filter_srcpkgs(src_pkgs, ""), src_pkgs)

  expect_identical(filter_srcpkgs(src_pkgs, "A"), subset_s3_list(src_pkgs, "AA"))
  expect_identical(filter_srcpkgs(src_pkgs, "A|B"), subset_s3_list(src_pkgs, c("AA", "BB")))
})


.prune_paths <- function() {
  prune_paths <- srcpkgs:::prune_paths

  expect_identical(prune_paths('AA'), 'AA')
  expect_identical(prune_paths('AA/'), 'AA/')

  expect_identical(prune_paths(c('AA', 'AA/B')), 'AA')
  expect_identical(prune_paths(c('AA/B', 'AA', 'AA/C')), 'AA')
  expect_identical(prune_paths(c('AA/T/CD/B', 'AA', 'BB')), c('AA', 'BB'))
  expect_identical(prune_paths(c('AA', 'BB/A/C')), c('AA', 'BB/A/C'))

  # prefixes
  expect_identical(prune_paths(c('AA', 'AAA')), c('AA', 'AAA'))

  # circular relations
  expect_identical(prune_paths(c('AA', 'AA/B/C', 'AA/B')), 'AA')
}
test_that("prune_paths", {.prune_paths()})


.find_srcpkgs_paths <- 
test_that("find_srcpkgs_paths", { 
  find_srcpkgs_paths <- srcpkgs:::find_srcpkgs_paths

  dir <- setup_temp_dir(setwd = FALSE)

  ### edge cases
  # no dir
  expect_error(find_srcpkgs_paths('does_not_exist'), 'bad directory')
  # dir empty
  expect_true(length(find_srcpkgs_paths(dir)) == 0)

  ### A package as level 1
  pkg_create(dir, 'AA')

  pkgs <- find_srcpkgs_paths(dir)

  # N.B: we compare only basenames because of Windows... :(
  expect_identical(basename(pkgs), 'AA')
  expect_identical(pkgs, find_srcpkgs_paths(dir)) # reproducible

  #### A and B in same level 1
  pkg_create(dir, 'BB')

  pkgs <- find_srcpkgs_paths(dir)
  
  expect_identical(pkgs, find_srcpkgs_paths(dir))
  expect_identical(basename(pkgs), c('AA', 'BB'))

  ### C is a level 2 pkg compared to A and B
  pkg_create(file.path(dir, 'C_proj'), 'CC')

  pkgs <- find_srcpkgs_paths(dir)
  
  expect_identical(pkgs, find_srcpkgs_paths(dir))
  expect_setequal(basename(pkgs), c('AA', 'BB', 'CC'))

  ### A1 inside A: should be ignored if prune == TRUE
  pkg_create(file.path(dir, 'AA'), 'AA1')

  pkgs <- find_srcpkgs_paths(dir)

  expect_identical(pkgs, find_srcpkgs_paths(dir))
  expect_setequal(basename(pkgs), c('AA', 'BB', 'CC'))

  pkgs <- find_srcpkgs_paths(dir, prune = FALSE)
  expect_setequal(basename(pkgs), c('AA', 'AA1', 'BB', "CC"))

  ### D inside a hidden directory: should be ignored
  pkg_create(file.path(dir, '.hidden'), 'DD')

  pkgs <- find_srcpkgs_paths(dir)

  expect_identical(pkgs, find_srcpkgs_paths(dir))
  expect_setequal(basename(pkgs), c('AA', 'BB', 'CC'))

  pkgs <- find_srcpkgs_paths(dir, all.files = TRUE)
  expect_true('DD' %in% basename(pkgs))

  ### package name is prefix of other package in same level
  pkg_create(dir, 'AAA')

  pkgs <- find_srcpkgs_paths(dir)
  expect_setequal(basename(pkgs), c('AA', 'AAA', 'BB', "CC"))

  ### should not "find" non-source package ==========================
  lib <- file.path(dir, 'lib')
  dir.create(lib)
  
  # create a source package in lib
  pkg_create(lib, 'installed1')

  # it is found by find_srcpkgs_paths()
  pkgs <- find_srcpkgs_paths(dir)
  expect_true('installed1' %in% basename(pkgs))

  # now turn it to a pseudo installed pakage by creating a Meta/ folder
  dir.create(file.path(lib, 'installed1', 'Meta'))
  expect_length(find_srcpkgs_paths(lib), 0)

  pkgs <- find_srcpkgs_paths(dir)
  expect_false('installed1' %in% basename(pkgs))
})



