test_that("document_network coupling returns correct edges", {
  d <- make_test_data()
  edges <- document_network(d, "coupling")

  get_w <- function(a, b) {
    row <- edges[
      (edges$from == a & edges$to == b) |
      (edges$from == b & edges$to == a), ]
    if (nrow(row) == 0) return(0)
    row$weight[1]
  }

  ## All pairs share 2 refs
  expect_equal(get_w("W1", "W2"), 2)
  expect_equal(get_w("W1", "W3"), 2)
  expect_equal(get_w("W2", "W3"), 2)
})

test_that("document_network citation returns directed internal citations", {
  d <- data.frame(id = c("W1", "W2", "W3"), stringsAsFactors = FALSE)
  d$references <- list(c("W2", "W3", "R1"), c("W3"), c("R2"))

  edges <- document_network(d, "citation")
  expect_true(any(edges$from == "W1" & edges$to == "W2"))
  expect_true(any(edges$from == "W1" & edges$to == "W3"))
  expect_false("R1" %in% c(edges$from, edges$to))
})

test_that("document_network with cosine gives coupling angle", {
  d <- make_test_data()
  edges <- document_network(d, "coupling", similarity = "cosine")

  get_w <- function(a, b) {
    row <- edges[
      (edges$from == a & edges$to == b) |
      (edges$from == b & edges$to == a), ]
    if (nrow(row) == 0) return(0)
    row$weight[1]
  }

  ## W1-W2: 2 shared out of 3 each -> 2/sqrt(3*3) = 2/3
  expect_equal(get_w("W1", "W2"), 2/3, tolerance = tol)
})
