# -*- tcl -*-
#Metric K-Center - Tests
#
#Set of tests includes also tests for subprocedures used by Unweighted Metric K-Center Algorithm:
#- Max Independent Set
#- Two Squared graph - create and extend.

# ------------------------------------------------------------------------------------
# Tests concerning returning right values by algorithm

#Test 1.0 
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.0 { Independent Set, 24 nodes graph } {
    SETUP_INDEPENDENTSET_1
    set result [ismaxindependentset mygraph \
		    [struct::graph::op::GreedyMaxIndependentSet mygraph]]
    mygraph destroy
    set result
} 1
#{node5 node7 node9 node11 node13 node14 node15 node16}

#Test 1.1
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.1 { Independent Set, complete K4 } {
    SETUP_UNWEIGHTED_K4
    set result [ismaxindependentset mygraph \
		    [struct::graph::op::GreedyMaxIndependentSet mygraph]]
    mygraph destroy
    set result
} 1

#Test 1.2
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.2 { Independent Set, C5 } {
    SETUP_C5
    set result [ismaxindependentset mygraph \
		    [struct::graph::op::GreedyMaxIndependentSet mygraph]]
    mygraph destroy
    set result
} 1

#Test 1.3 - Tight Example for K-Center, it chooses external node (with biggest adjacent edge weight = 2)
#when it's possible to choose central node ( with each adjacent edge weight = 1)
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.3 { KCenter, Tight Example } {
    # Note: Applied to non-complete graph, violating algorithm pre-conditions.
    SETUP_KCENTER_1
    set result [lsort -dict [struct::graph::op::UnweightedKCenter mygraph 1]]
    mygraph destroy
    set result
} [tmE {node2} {node1}]

#Test 1.4 - different k value
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.4 { KCenter, Tight Example } {
    # Note: Applied to non-complete graph, violating algorithm pre-conditions.
    SETUP_KCENTER_1
    set result [lsort -dict [struct::graph::op::UnweightedKCenter mygraph 2]]
    mygraph destroy
    set result
} [tmE {node2 node6} {node1 node2}]

#Test 1.5 - case with max logical k value for that graph
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.5 { KCenter, Tight Example } {
    # Note: Applied to non-complete graph, violating algorithm pre-conditions.
    SETUP_KCENTER_1
    set result [lsort -dict [struct::graph::op::UnweightedKCenter mygraph 6]]
    mygraph destroy
    set result
} [tmE \
       {node2 node3 node4 node5 node6 node7} \
       {node1 node2 node3 node4 node5 node6}]

#Test 1.6 - case when k is inexplicably big
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.6 { KCenter, Tight Example } {
    # Note: Applied to non-complete graph, violating algorithm pre-conditions.
    SETUP_KCENTER_1
    set result [lsort -dict [struct::graph::op::UnweightedKCenter mygraph 60]]
    mygraph destroy
    set result
} [tmE \
       {node2 node3 node4 node5 node6 node7} \
       {node1 node2 node3 node4 node5 node6}]

#Test 1.7 - another graph test
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.7 { KCenter, graph simulation } {
    SETUP_KCENTER_2
    set result [lsort -dict [struct::graph::op::UnweightedKCenter mygraph 2]]
    mygraph destroy
    set result
} [tmE {node2 node7} {node1 node8}]

#Tests 1.8 - 1.12 - test cases for creating squared graphs operations
#Test 1.8
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.8 { KCenter, graph simulation } {
    SETUP_TWOSQUARED_1
    set solution [struct::graph::op::createSquaredGraph mygraph]
    set result [lsort -dict [undirected [$solution arcs]]]
    $solution destroy
    mygraph destroy
    set result
} {{node1 node2} {node1 node3} {node1 node4} {node2 node3} {node2 node4} {node2 node5} {node3 node4} {node3 node5} {node3 node6} {node3 node7} {node4 node5} {node5 node6} {node5 node7} {node5 node8} {node6 node7} {node7 node8}}

#Test 1.9
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.9 { KCenter, graph simulation } {
    SETUP_TWOSQUARED_2
    set solution [struct::graph::op::createSquaredGraph mygraph]
    set result [lsort -dict [undirected [$solution arcs]]]
    $solution destroy
    mygraph destroy
    set result
} {{node1 node2} {node1 node3} {node2 node3} {node2 node4} {node3 node4} {node3 node5} {node4 node5}}

#Test 1.10
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.10 { KCenter, graph simulation } {
    SETUP_TWOSQUARED_2
    SETUP_TWOSQUARED_3
    set solution [struct::graph::op::extendTwoSquaredGraph mygraph2 mygraph node4 node5]
    set result [lsort -dict [undirected [$solution arcs]]]
    mygraph destroy
    mygraph2 destroy
    set result
} {{node1 node2} {node1 node3} {node2 node3} {node2 node4} {node3 node4} {node3 node5} {node4 node5}}

#Test 1.11
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.11 { KCenter, graph simulation } {
    SETUP_TWOSQUARED_1
    mygraph arc delete "node3 node5"
    SETUP_TWOSQUARED_4
    set solution [struct::graph::op::extendTwoSquaredGraph mygraph2 mygraph node3 node4]
    set result [lsort -dict [undirected [$solution arcs]]]
    mygraph destroy
    mygraph2 destroy
    set result
} {{node1 node2} {node1 node3} {node1 node4} {node2 node3} {node2 node4} {node3 node4} {node5 node6} {node5 node7} {node5 node8} {node6 node7} {node7 node8}}

#Test 1.12
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-1.12 { KCenter, graph simulation } {
    SETUP_TWOSQUARED_1
    SETUP_TWOSQUARED_4
    set solution [struct::graph::op::extendTwoSquaredGraph mygraph2 mygraph node3 node5]
    set result [lsort -dict [undirected [$solution arcs]]]
    mygraph destroy
    mygraph2 destroy
    set result
} {{node1 node2} {node1 node3} {node1 node4} {node2 node3} {node2 node4} {node2 node5} {node3 node4} {node3 node5} {node3 node6} {node3 node7} {node4 node5} {node5 node6} {node5 node7} {node5 node8} {node6 node7} {node7 node8}}

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

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

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

test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-2.2 { KCenter, wrong args, too many} {
    catch {struct::graph::op::UnweightedKCenter G y x} msg
    set msg
} [tcltest::tooManyArgs struct::graph::op::UnweightedKCenter {G k}]

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


#Test 3.1 - case when k is too low
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-3.0 { KCenter, wrong input } {
    SETUP_KCENTER_1
    catch { struct::graph::op::UnweightedKCenter mygraph 0 } result
    mygraph destroy
    set result
} [WrongValueAtInput {k}]

#Test 3.0 - case when given graph doesn't have weights at all edges
test graphop-t${treeimpl}-g${impl}-s${setimpl}-st${stkimpl}-q${queimpl}-KCenter-3.1 {KCenter, lack of weights at edges } {
    SETUP_UNWEIGHTED_K4
    catch {struct::graph::op::UnweightedKCenter mygraph k} result
    mygraph destroy
    set result
} [UnweightedArcOccurance]
