# -*- tcl -*-
# Tests for the counter module.
#
# This file contains a collection of tests for a module in the
# Standard Tcl Library. Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# Copyright (c) 1998-2000 by Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: counter.test,v 1.13 2006/10/09 21:41:40 andreas_kupries Exp $

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

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.2
testsNeedTcltest 1.0

testing {
    useLocal counter.tcl counter
}

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

proc Stamp {tag} {
    puts stderr "[clock format [clock seconds]] [clock clicks -milliseconds] $tag"
}

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

test counter-1.1 {counter::init} {
    catch {counter::init} err
} {1}

if 0 {
    set x 0
    puts "incr scaler [time {incr x} 100]"

    set a(x) 0
    puts "incr array [time {incr a(x)} 100]"

    set a(x) 0
    set a(n) 0
    puts "rawcount [time {
    set a(x) [expr {$a(x) + 2.4}]
    incr a(n)
} 100]"
}

test counter-simple {counter::count} {
    counter::init simple
    counter::count simple
    counter::count simple
    counter::count simple
    counter::get simple
} {3}
#puts "simple [time {counter::count simple} 100]"

test counter-avg-1.0 {counter::count} {
    counter::init avg
    counter::count avg 2.2
    counter::count avg 3.3
    counter::count avg 9.8
    format %3.1f [counter::get avg -avg]
} {5.1}

test counter-avg-1.1 {counter::count} {
    counter::init avg
    counter::get avg -avg
} {0}

test counter-lastn-1.0 {averge over lastn} {
    counter::init lastn -lastn 4
    counter::count lastn 2.2
    counter::count lastn 4.6
    counter::get lastn -avgn
} {3.4}

test counter-lastn-1.1 {averge over lastn} {
    counter::init lastn -lastn 4
    counter::count lastn 2.2
    counter::count lastn 3.3
    counter::count lastn 8.6
    counter::count lastn 4.1
    counter::count lastn 6.9
    counter::count lastn 0.4
    counter::get lastn -avgn
} {5.0}
#puts "lastn [time {counter::count lastn 2.4} 100]"

test counter-lastn-1.2 {lifetime average} {
    counter::init lastn -lastn 4
    counter::count lastn 2.2
    counter::count lastn 3.3
    counter::count lastn 8.6
    counter::count lastn 4.1
    counter::count lastn 6.9
    counter::count lastn 0.4
    counter::get lastn -avg
} {4.25}
#puts "lastn [time {counter::count lastn 2.4} 100]"

test counter-hist-1.0 {basic histogram} {
    counter::init hist -hist 10
    counter::count hist 2.2
    counter::count hist 18.6
    counter::count hist 14.1
    counter::count hist 26.9
    counter::count hist 20.4
    counter::count hist 23.3
    counter::count hist 53.3
    counter::get hist -hist
} {0 1 1 2 2 3 5 1}
test counter-hist-1.1 {histogram average} {
    counter::init hist -hist 10
    counter::count hist 2.2
    counter::count hist 18.6
    counter::count hist 14.1
    counter::count hist 26.9
    counter::count hist 20.4
    counter::count hist 23.3
    counter::count hist 53.3
    format %13.10f [counter::get hist -avg]
} {22.6857142857}
#puts "hist [time {counter::count hist 2.4} 100]"

test counter-hist2x {counter::count} {
    counter::init hist -hist2x 10
    counter::count hist 8
    counter::count hist 18
    counter::count hist 28
    counter::count hist 38
    counter::count hist 48
    counter::count hist 58
    counter::count hist 68
    counter::count hist 78
    counter::count hist 178
    counter::count hist 478
    counter::get hist -hist
} {0 1 1 1 2 2 3 4 5 1 6 1}
#puts "hist2x [time {counter::count hist 50} 100]"

test counter-hist10x {counter::count} {
    counter::init hist -hist10x 10
    counter::count hist 8
    counter::count hist 18
    counter::count hist 28
    counter::count hist 38
    counter::count hist 48
    counter::count hist 58
    counter::count hist 68
    counter::count hist 78
    counter::count hist 178
    counter::count hist 478
    counter::count hist 1478
    counter::count hist 1478000
    counter::get hist -hist
} {0 1 1 7 2 2 3 1 6 1}

test counter-histlog {counter::count} {
    counter::init histlog -histlog 1
    counter::count histlog 0.1
    counter::count histlog 0.5
    counter::count histlog 0.9
    counter::count histlog 1.0
    counter::count histlog 2
    counter::count histlog 3
    counter::count histlog 5
    counter::count histlog 10
    counter::count histlog 30
    counter::count histlog 50
    counter::count histlog 100
    counter::count histlog 300
    counter::count histlog 500
    counter::count histlog 1000
    counter::get histlog -hist
} {-2 1 0 4 1 2 2 1 3 2 4 1 5 1 6 2}

test counter-timehist {counter::count} {load-dependent} {
    counter::init hits -timehist 4
    catch {#puts stderr "Pausing during timehist tests"}
    counter::count hits 2
    # We need to reach in and find out what bucket was used
    array set info [counter::get hits -all]
    set min0 $info(lastMinute)
    after [expr 4000]
    counter::count hits 4
    after [expr 4000]
    counter::count hits 8
    set result [list]
    foreach {n v} [counter::get hits -hist] {
	if {$v > 0} {
	    lappend result [expr {$n - $min0}] $v
	}
    }

    #puts "timehist [time {counter::count hits} 100]"

    set result
} {0 2 1 4 2 8}


test counter-countNames {counter::names} {
    counter::init simple
    counter::init avg
    counter::init lastn -lastn 4
    counter::init hist -hist 10
    counter::init histlog -histlog 1
    counter::init hits -timehist 4
    lsort [counter::names]
} {avg hist histlog hits lastn simple}

test counter-countExists {counter::exists} {
    counter::init simple
    counter::init lastn -lastn 4
    unset counter::T-lastn 
    list [counter::exists simple] [counter::exists lastn]
} {1 0}

test counter-countReset {counter::reset} {
    counter::init simple
    counter::count simple 1
    counter::count simple 1
    counter::count simple 1
    counter::reset simple
    counter::get simple
} {0}


testsuiteCleanup
