## Tests for S3 print/summary methods and as_bibnets_network()

test_that("bibnets_network has correct class", {
  d <- make_test_data()
  edges <- keyword_network(d)
  expect_s3_class(edges, "bibnets_network")
  expect_s3_class(edges, "data.frame")
})

test_that("all network functions return bibnets_network", {
  d <- make_test_data()
  dext <- d
  dext$countries    <- list(c("USA","UK"), c("USA","DE"), c("UK","DE"))
  dext$affiliations <- list(c("MIT","Oxford"), c("MIT","TU Berlin"), c("Oxford","TU Berlin"))

  fns <- list(
    keyword_network(d),
    author_network(d, "collaboration"),
    reference_network(d, threshold = 0),
    document_network(d, "coupling"),
    source_network(d, "coupling"),
    country_network(dext, "collaboration"),
    institution_network(dext, "collaboration"),
    conetwork(d, "keywords")
  )

  for (e in fns) {
    expect_true(inherits(e, "bibnets_network"))
  }
})

test_that("network_type attribute is set correctly", {
  d <- make_test_data()
  expect_equal(attr(keyword_network(d), "network_type"), "keyword_co_occurrence")
  expect_equal(attr(author_network(d, "collaboration"), "network_type"), "author_collaboration")
  expect_equal(attr(author_network(d, "coupling"), "network_type"), "author_coupling")
  expect_equal(attr(reference_network(d, threshold=0), "network_type"), "reference_co_citation")
  expect_equal(attr(document_network(d, "coupling"), "network_type"), "document_coupling")
  expect_equal(attr(document_network(d, "citation"), "network_type"), "document_citation")
})

test_that("print.bibnets_network outputs correctly", {
  d <- make_test_data()
  edges <- keyword_network(d)
  out <- capture.output(print(edges))
  ## First line should mention nodes and edges
  expect_true(grepl("bibnets network", out[1]))
  expect_true(grepl("nodes", out[1]))
  expect_true(grepl("edges", out[1]))
  ## Should mention the type
  expect_true(any(grepl("keyword_co_occurrence", out)))
})

test_that("print.bibnets_network n= argument limits rows shown", {
  d <- make_test_data()
  edges <- keyword_network(d)
  ## Show only 2 rows
  out <- capture.output(print(edges, n = 2))
  ## Should mention "more edges" if there are more than 2
  if (nrow(edges) > 2) {
    expect_true(any(grepl("more edges", out)))
  }
})

test_that("summary.bibnets_network outputs correctly", {
  d <- make_test_data()
  edges <- keyword_network(d)
  out <- capture.output(summary(edges))
  expect_true(any(grepl("bibnets network", out)))
  expect_true(any(grepl("Nodes", out)))
  expect_true(any(grepl("Edges", out)))
  expect_true(any(grepl("Density", out)))
  expect_true(any(grepl("Top nodes", out)))
})

test_that("summary.bibnets_network returns object invisibly", {
  d <- make_test_data()
  edges <- keyword_network(d)
  ret <- capture.output(x <- summary(edges))
  expect_identical(x, edges)
})

test_that("print.bibnets_network returns object invisibly", {
  d <- make_test_data()
  edges <- keyword_network(d)
  ret <- capture.output(x <- print(edges))
  expect_identical(x, edges)
})

test_that("as_bibnets_network stamps correct attributes", {
  df <- data.frame(from = "A", to = "B", weight = 1, stringsAsFactors = FALSE)
  net <- bibnets:::as_bibnets_network(df, "test_type", "full", "cosine")
  expect_s3_class(net, "bibnets_network")
  expect_equal(attr(net, "network_type"), "test_type")
  expect_equal(attr(net, "counting"),     "full")
  expect_equal(attr(net, "similarity"),   "cosine")
})
