# -*- tcl -*-
#Breadth-First Search procedures
#
# ------------------------------------------------------------------------------------
# Tests concerning returning right values by algorithm

# ------------------------------------------------------------------------------------

# ------------------------------------------------------------------------------------
#Tests for shortest paths finding using BFS algorithm
#Test 1.0 
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-1.0 { graph simulation } {
    SETUP_BFS_1
    set result [dictsort [struct::graph::op::ShortestsPathsByBFS mygraph s distances]]
    mygraph destroy
    set result
} {a 2 b 7 c 13 d 9 s 0 x 5}

#Test 1.1
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-1.1 { graph simulation } {
    SETUP_BFS_1
    set result [dictsort [struct::graph::op::ShortestsPathsByBFS mygraph s paths]]
    mygraph destroy
    set result
} {a {s x} b {s x a} c {s x a b} d {s x a b} x s}

#Test 1.2
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-1.2 { graph simulation } {
    SETUP_BFS_2
    set result [dictsort [struct::graph::op::ShortestsPathsByBFS mygraph s distances]]
    mygraph destroy
    set result
} {a 13 b 23 c 11 d 9 s 0 t 18}

#Test 1.3
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-1.3 { graph simulation } {
    SETUP_BFS_2
    set result [dictsort [struct::graph::op::ShortestsPathsByBFS mygraph s paths]]
    mygraph destroy
    set result
} {a {s d} b {s d c t} c {s d} d s t {s d c}}

#Test 1.4
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-1.4 { graph simulation } {
    SETUP_BELLMANFORD_2
    set result [dictsort [struct::graph::op::ShortestsPathsByBFS mygraph node1 distances]]
    mygraph destroy
    set result
} {node1 0 node2 8 node3 5 node4 7 node5 3 node6 5}

#Test 1.5
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-1.5 { graph simulation } {
    SETUP_BELLMANFORD_2
    set result [dictsort [struct::graph::op::ShortestsPathsByBFS mygraph node1 paths]]
    mygraph destroy
    set result
} {node2 node1 node3 {node1 node2 node4} node4 {node1 node2} node5 {node1 node2 node4 node3} node6 {node1 node2 node4 node3 node5}}

#Tests for standard BFS Algorithm
#Test 1.6
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-1.6 { graph simulation } {
    SETUP_BFS_2
    set solution [struct::graph::op::BFS mygraph s graph]
    set result "[lsort [$solution nodes]] | [lsort [$solution arcs]]"
    $solution destroy
    mygraph destroy
    set result
} [tmE \
       {a b c d s t | {a b} {c t} {d c} {s a} {s d}} \
       {a b c d s t | {a b} {a c} {b t} {s a} {s d}}]
# Tcl ordering: d,a | Both results are valid.
# C   ordering: a,d |

#Test 1.7
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-1.7 { graph simulation } {
    SETUP_BFS_2
    set result [struct::graph::op::BFS mygraph s tree]
    set tree {}
    foreach node [$result nodes] {
	lappend tree [list $node [lsort [$result children $node]]]
    }
    mygraph destroy
    $result destroy
    lsort $tree
} [tmE \
       {{a b} {b {}} {c t} {d c} {s {a d}} {t {}}} \
       {{a {b c}} {b t} {c {}} {d {}} {s {a d}} {t {}}}]
# See 1.6.

#Test 1.8
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-1.8 { graph simulation } {
    SETUP_MDST_1
    set solution [struct::graph::op::BFS mygraph d graph]
    set result "[lsort [$solution nodes]] | [lsort [$solution arcs]]"
    mygraph destroy
    $solution destroy
    set result
} [tmE \
       {a b c d e f g h i j | {b a} {d c} {d e} {d h} {e f} {e g} {g i} {h b} {h j}} \
       {a b c d e f g h i j | {b a} {c b} {c g} {d c} {d e} {d h} {e f} {g i} {h j}}]

#Test 1.9
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-1.9 { graph simulation } {
    SETUP_MDST_1
    set result [struct::graph::op::BFS mygraph d tree]
    set tree {}
    foreach node [$result nodes] {
	lappend tree [list $node [lsort [$result children $node]]]
    }
    mygraph destroy
    $result destroy
    lsort $tree
} [tmE \
       {{a {}} {b a} {c {}} {d {c e h}} {e {f g}} {f {}} {g i} {h {b j}} {i {}} {j {}}} \
       {{a {}} {b a} {c {b g}} {d {c e h}} {e f} {f {}} {g i} {h j} {i {}} {j {}}}]

#Test 1.10
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-1.10 { graph simulation } {
    SETUP_BELLMANFORD_2
    set solution [struct::graph::op::BFS mygraph node1 graph]
    set result "[lsort [$solution nodes]] | [lsort [$solution arcs]]"
    mygraph destroy
    $solution destroy
    set result
} [tmE \
       {node1 node2 node3 node4 node5 node6 | {node1 node2} {node1 node3} {node2 node4} {node3 node5} {node4 node6}} \
       {node1 node2 node3 node4 node5 node6 | {node1 node2} {node1 node3} {node3 node4} {node3 node5} {node4 node6}}]

#Test 1.11
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-1.11 { graph simulation } {
    SETUP_BELLMANFORD_2
    set result [struct::graph::op::BFS mygraph node1 tree]
    set tree {}
    foreach node [$result nodes] {
	lappend tree [list $node [lsort [$result children $node]]]
    }
    mygraph destroy
    $result destroy
    lsort $tree
} [tmE \
       {{node1 {node2 node3}} {node2 node4} {node3 node5} {node4 node6} {node5 {}} {node6 {}}} \
       {{node1 {node2 node3}} {node2 {}} {node3 {node4 node5}} {node4 node6} {node5 {}} {node6 {}}}]

# -------------------------------------------------------------------------
# Wrong # args: Missing, Too many

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-2.0 { BFS, wrong args, missing } {
    catch {struct::graph::op::ShortestsPathsByBFS} msg
    set msg
} [tcltest::wrongNumArgs struct::graph::op::ShortestsPathsByBFS {G s outputFormat} 0]

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-2.1 { BFS, wrong args, missing } {
    catch {struct::graph::op::ShortestsPathsByBFS G} msg
    set msg
} [tcltest::wrongNumArgs struct::graph::op::ShortestsPathsByBFS {G s outputFormat} 1]

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-2.2 { BFS, wrong args, missing } {
    catch {struct::graph::op::ShortestsPathsByBFS G s} msg
    set msg
} [tcltest::wrongNumArgs struct::graph::op::ShortestsPathsByBFS {G s outputFormat} 2]

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-2.3 { BFS, wrong args, too many} {
    catch {struct::graph::op::ShortestsPathsByBFS G a b c} msg
    set msg
} [tcltest::tooManyArgs struct::graph::op::ShortestsPathsByBFS {G s outputFormat}]

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-2.4 { BFS, wrong args, missing } {
    catch {struct::graph::op::BFS} msg
    set msg
} [tcltest::wrongNumArgs struct::graph::op::BFS {G s outputFormat} 0]

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-2.5 { BFS, wrong args, missing } {
    catch {struct::graph::op::BFS G} msg
    set msg
} [tcltest::wrongNumArgs struct::graph::op::BFS {G s outputFormat} 1]

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-2.6 { BFS, wrong args, missing } {
    catch {struct::graph::op::BFS G s} msg
    set msg
} [tcltest::wrongNumArgs struct::graph::op::BFS {G s outputFormat} 2]

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-2.7 { BFS, wrong args, too many} {
    catch {struct::graph::op::BFS G a b c} msg
    set msg
} [tcltest::tooManyArgs struct::graph::op::BFS {G s outputFormat}]

# -------------------------------------------------------------------------
# Logical arguments checks and failures

#Test 3.0
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-ShortestsPathsByBFS-3.0 { ShortestsPathsByBFS } {
    SETUP
    catch {struct::graph::op::ShortestsPathsByBFS mygraph s badOption} result
    mygraph destroy
    set result
} {Unknown output format "badOption", expected distances, or paths.}

#Test 3.1
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-BFS-3.1 { BFS } {
    SETUP
    catch {struct::graph::op::BFS mygraph s badOption} result
    mygraph destroy
    set result
} {Unknown output format "badOption", expected graph, or tree.}
