#!/usr/bin/env tclkit
# %renumber<^\s*test >%

source [file join [file dir [info script]] initests.tcl]

test 0 {} {
    package require vlerq
} $version

test 1 {} {
    vlerq roweq [vlerq meta ""] 0 [vlerq meta ""] 0
} 1

test 2 {} {
    vlerq roweq [vlerq meta ""] 0 [vlerq meta ""] 1
} 0

test 3 {} {
    vlerq roweq [vlerq def {L:L F:F D:D B:B} {1 2 3 4}] 0 \
                [vlerq def {L:L F:F D:D B:B} {1 2.0 3.0 4}] 0
} 1

test 4 {} {
    vlerq sortmap [vlerq def A:I {1 2 1 2 1 3}]
} {0 2 4 1 3 5}

test 5 {} {
    vlerq sortmap [vlerq def A {a b a b a c}]
} {0 2 4 1 3 5}

test 6 {} {
    vlerq sort [vlerq def A {a b a b a c}]
} {data {mdef A} {a a a b b c}}

test 7 {} {
    vlerq sort [vlerq def A {a b a c}]
} {data {mdef A} {a a b c}}

test 8 {} {
    vlerq compare "" ""
} 0
    
test 9 {} {
    vlerq compare 0 0
} 0
    
test 10 {} {
    vlerq compare 12 12
} 0
    
test 11 {} {
    vlerq compare 12 23
} -1
    
test 12 {} {
    vlerq compare "" 12
} 1
    
test 13 {} {
    vlerq compare "" [vlerq meta ""]
} -1
    
test 14 {} {
    vlerq compare [vlerq meta ""] [vlerq meta ""]
} 0
    
test 15 {} {
    vlerq compare [vlerq def A {}] [vlerq def A {}]
} 0
    
test 16 {} {
    vlerq compare [vlerq def A a] [vlerq def A a]
} 0
    
test 17 {} {
    vlerq compare [vlerq def A a] [vlerq def A b]
} -1
    
test 18 {} {
    vlerq compare [vlerq def A a] [vlerq def A {a b}]
} -1
    
test 19 {} {
    vlerq compare [vlerq def A {}] [vlerq def A a]
} -1
    
test 20 {} {
    vlerq compare [vlerq def A b] [vlerq def A {a b}]
} 1
    
test 21 {} {
    vlerq compare [vlerq def A {}] [vlerq def B {}]
} -1
    
test 22 {} {
    vlerq compare [vlerq def A b] [vlerq def B a]
} -1
    
test 23 {} {
    vlerq compare [vlerq def A {}] [vlerq def {A B} {}]
} -1
    
test 24 {} {
    vlerq compare [vlerq def {A B} {}] [vlerq def {A B} {}]
} 0
    
test 25 {} {
    vlerq compare [vlerq def {A B} {a b}] [vlerq def {A B} {a b}]
} 0
    
test 26 {} {
    vlerq compare [vlerq def {A B} {a b aa bb}] [vlerq def {A B} {a b aa bb}]
} 0
    
test 27 {} {
    vlerq compare [vlerq def {A B} {a b}] [vlerq def {A B} {a b aa bb}]
} -1
    
test 28 {} {
    vlerq compare [vlerq def {A B} {a b aa bb}] [vlerq def {A B} {a b}]
} 1
    
test 29 {} {
    vlerq compare [vlerq def {A B} {a b aa bb}] [vlerq def {A B} {a b aaa bb}]
} -1
    
test 30 {} {
    vlerq compare [vlerq def {A B} {a b aaa bb}] [vlerq def {A B} {a b aa bb}]
} 1
    
test 31 {} {
    vlerq compare [vlerq def {A B} {a b aa bb}] [vlerq def {A B} {a b aa bbb}]
} -1
    
test 32 {} {
    vlerq compare [vlerq def {A B} {a b aa bbb}] [vlerq def {A B} {a b aa bb}]
} 1
    
test 33 {} {
    vlerq compare [vlerq def A {}] [vlerq def A:I {}]
} 1
    
test 34 {} {
    vlerq compare [vlerq def A {}] [vlerq def A:I {}]
} 1
    
test 35 {} {
    vlerq compare [vlerq def A:I 1] [vlerq def A:I 01]
} 0
    
test 36 {} {
    vlerq compare [vlerq def A:I 01] [vlerq def A:I 1]
} 0

test 37 {} {
    vlerq compare [vlerq def A:I 19] [vlerq def A:I 2]
} 1
    
test 38 {} {
    vlerq compare [vlerq def A:I 2] [vlerq def A:I 19]
} -1
    
test 39 {} {
    vlerq compare [vlerq def A 19] [vlerq def A 2]
} -1
    
test 40 {} {
    vlerq compare [vlerq def A 2] [vlerq def A 19]
} 1

test 41 {} {
    vlerq compare [vlerq def {L:L F:F D:D B:B} {1 2 3 4}] \
                  [vlerq def {L:L F:F D:D B:B} {1 2.0 3.0 4}]
} 0

test 42 {} {
    vlerq max [vlerq def A {a b c}] 0
} c
    
test 43 {} {
    vlerq max [vlerq def A {a b c}] 0
} c
    
test 44 {} {
    vlerq max [vlerq def A {a b c}] 0
} c
    
test 45 {} {
    vlerq max [vlerq def A:I {1 2 3}] 0
} 3
    
test 46 {} {
    vlerq max [vlerq def A:I {1 2 3}] 0
} 3
    
test 47 {} {
    vlerq max [vlerq def A:I {1 2 3}] A
} 3
    
test 48 {} {
    vlerq min [vlerq def A {a b c}] 0 d
} a
    
test 49 {} {
    vlerq min [vlerq def A {a b c}] 0
} a
    
test 50 {} {
    vlerq min [vlerq def A {a b c}] 0
} a
    
test 51 {} {
    vlerq min [vlerq def A {a b c ""}] 0
} ""
    
test 52 {} {
    vlerq min [vlerq def A:I {1 2 3}] 0 4
} 1
    
test 53 {} {
    vlerq min [vlerq def A:I {1 2 3}] 0
} 1
    
test 54 {} {
    vlerq min [vlerq def A:I {1 2 3}] A
} 1
    
test 55 {} {
    vlerq sum [vlerq def A:I {}] 0
} 0
    
test 56 {} {
    vlerq sum [vlerq def A:I {1 2 3}] 0
} 6
    
test 57 {} {
    vlerq sum [vlerq def A:I {0 1 -2}] 0
} -1
    
test 58 {} {
    vlerq sum [vlerq def A:I {0 1 -2}] A
} -1
    
test 59 {} {
    vlerq sum [vlerq def A:L {10000000000 20000000000 30000000000}] 0
} 60000000000
    
test 60 {} {
    vlerq sum [vlerq def A:F {1000000000.1 2000000000.2 3000000000.3}] 0
} 6000000000.0
    
test 61 {} {
    vlerq sum [vlerq def A:D {1000000000.1 2000000000.2 3000000000.3}] 0
} 6000000000.6

test 62 {see F147, this works} {
    view {a b} def {1 a} | group a g | collect {[view $(g) get]}
} {a}

test 63 {F147 - this is ok} {
    view {a b} def {1 a} | group a g | structdesc
} {a:S,g[b:S]}

test 64 {F147 - so is this} {
    view {a b} def {1 a} | group a g | dump
} { \
  a  g 
  -  --
  1  #1}

test 65 {F147 - this throws an error} -constraints x -body {
    view {a b} def {1 a} | group a g | loop {puts [view $(g) sort | dump]}
} -output {?}

test 66 {F147 - this throws an assertion} -constraints x -body {
    view {a b} def {1 a} | group a g | loop {puts [view $(g) sort | freeze | get]}
} -output {?}

test 67 {F147 - and this crashes!} x {
    view {a b} def {1 a} | group a g | collect {[view $(g) sort | get]}
} {a}

::tcltest::cleanupTests
