
context("eulerian_path")

test_that("has_eulerian_path works", {
    g <- graph_from_literal(A-B-C-D-A)
    expect_true(has_eulerian_path(g))

    g <- graph_from_literal(A-B-C-D-E-A-F-D-B-F-E, simplify=FALSE)
    expect_true(has_eulerian_path(g))
    
    g <- graph_from_literal(A-B-C-D-A-D-C, B-D, simplify=FALSE)
    expect_false(has_eulerian_path(g))

    g <- make_empty_graph(10)
    expect_true(has_eulerian_path(g))
})

test_that("eulerian_path works", {
    g <- graph_from_literal(A-B-C-D-A)
    path <- eulerian_path(g)
    path$epath <- as.vector(path$epath)
    path$vpath <- as.vector(path$vpath)
    expect_equal(path$epath, as.vector(E(g, path=c(1:4, 1))))
    expect_equal(path$vpath, c(1:4, 1))

    g <- make_empty_graph(10)
    path <- eulerian_path(g)
    path$epath <- as.vector(path$epath)
    path$vpath <- as.vector(path$vpath)
    expect_equal(path$epath, numeric(0))
    expect_equal(path$vpath, numeric(0))

    g <- graph_from_literal(A-B-C-D-E-A-F-D-B-F-E, simplify=FALSE)
    path <- eulerian_path(g)
    path$epath <- as.vector(path$epath)
    path$vpath <- as.vector(path$vpath)
    expect_equal(path$epath, as.vector(E(g, path=c(1, 2, 3, 4, 2, 6, 1, 5, 4, 6, 5))))
    expect_equal(path$vpath, c(1, 2, 3, 4, 2, 6, 1, 5, 4, 6, 5))
    
    g <- graph_from_literal(A-B-C-D-A-D-C, B-D, simplify=FALSE)
    expect_error(eulerian_path(g), "The graph does not have an Eulerian path")
})

context("eulerian_cycle")

test_that("has_eulerian_cycle works", {
    g <- graph_from_literal(A-B-C-D-A)
    expect_true(has_eulerian_cycle(g))

    g <- graph_from_literal(A-B-C-D-E-A-F-D-B-F-E, simplify=FALSE)
    expect_false(has_eulerian_cycle(g))
    
    g <- graph_from_literal(A-B-C-D-A-D-C, B-D, simplify=FALSE)
    expect_false(has_eulerian_cycle(g))

    g <- make_empty_graph(10)
    expect_true(has_eulerian_cycle(g))
})

test_that("eulerian_cycle works", {
    g <- graph_from_literal(A-B-C-D-A)
    cycle <- eulerian_cycle(g)
    cycle$epath <- as.vector(cycle$epath)
    cycle$vpath <- as.vector(cycle$vpath)
    expect_equal(cycle$epath, as.vector(E(g, path=c(1:4, 1))))
    expect_equal(cycle$vpath, c(1:4, 1))

    g <- make_empty_graph(10)
    cycle <- eulerian_cycle(g)
    cycle$epath <- as.vector(cycle$epath)
    cycle$vpath <- as.vector(cycle$vpath)
    expect_equal(cycle$epath, numeric(0))
    expect_equal(cycle$vpath, numeric(0))

    g <- graph_from_literal(A-B-C-D-E-A-F-D-B-F-E, simplify=FALSE)
    expect_error(eulerian_cycle(g), "The graph does not have an Eulerian cycle")
    
    g <- graph_from_literal(A-B-C-D-A-D-C, B-D, simplify=FALSE)
    expect_error(eulerian_cycle(g), "The graph does not have an Eulerian cycle")
})
