summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/tie/tie_file.test
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/tie/tie_file.test')
-rw-r--r--tcllib/modules/tie/tie_file.test392
1 files changed, 392 insertions, 0 deletions
diff --git a/tcllib/modules/tie/tie_file.test b/tcllib/modules/tie/tie_file.test
new file mode 100644
index 0000000..59ab914
--- /dev/null
+++ b/tcllib/modules/tie/tie_file.test
@@ -0,0 +1,392 @@
+# Tests for the tie module. -*- tcl -*-
+#
+# Copyright (c) 2004 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+# All rights reserved.
+#
+# RCS: @(#) $Id: tie_file.test,v 1.10 2006/10/12 04:45:57 andreas_kupries Exp $
+
+# -------------------------------------------------------------------------
+
+source [file join \
+ [file dirname [file dirname [file join [pwd] [info script]]]] \
+ devtools testutilities.tcl]
+
+testsNeedTcl 8.4
+testsNeedTcltest 1.0
+
+support {
+ use snit/snit.tcl snit
+ useLocal tie.tcl tie
+}
+testing {
+ useLocal tie_file.tcl tie::std::file
+}
+
+# -------------------------------------------------------------------------
+# Creation of array data sources
+# Errors: Undefined variable, scalar, local variable
+
+test tie-file-1.0 {file creation, wrong#args} {
+ catch {tie::std::file} msg
+ set msg
+} {Error in constructor: wrong # args: should be "::tie::std::file::Snit_constructor type selfns win self thepath"}
+
+test tie-file-1.1 {file creation, wrong#args} {
+ catch {tie::std::file x} msg
+ set msg
+} {Error in constructor: wrong # args: should be "::tie::std::file::Snit_constructor type selfns win self thepath"}
+
+test tie-file-1.2 {file creation, wrong#args} {
+ catch {tie::std::file x y z} msg
+ set msg
+} {Error in constructor: wrong # args: should be "::tie::std::file::Snit_constructor type selfns win self thepath"}
+
+test tie-file-1.3 {file creation, ok args, unwritable file} {unixOnly notRoot} {
+ set f [makeFile {} journal]
+ file attributes $f -permissions ugo-w
+ catch {tie::std::file x $f} msg
+ removeFile journal
+ string map [list $f @] $msg
+} {Error in constructor: couldn't open "@": permission denied}
+
+test tie-file-1.4 {file creation, ok args, unwritable file} {winOnly} {
+ set f [makeFile {} journal]
+ file attributes $f -readonly 1
+ catch {tie::std::file x $f} msg
+ file attributes $f -readonly 0
+ removeFile journal
+ string map [list $f @] $msg
+} {Error in constructor: couldn't open "@": permission denied}
+
+test tie-file-1.5 {file creation, ok args, unreadable file} {unixOnly notRoot} {
+ set f [makeFile {} journal]
+ file attributes $f -permissions ugo-r
+ catch {tie::std::file x $f} msg
+ removeFile journal
+ string map [list $f @] $msg
+} {Error in constructor: couldn't open "@": permission denied}
+
+test tie-file-1.6 {file creation, ok args, uncreateable file} {unixOnly notRoot} {
+ set d [makeDirectory jtest]
+ set f [makeFile {} jtest/journal]
+
+ # Delete the created file, we want the tie code to try to generate
+ # it (and expect it to fail).
+ file delete $f
+
+ file attributes $d -permissions ugo-w
+
+ catch {tie::std::file x $f} msg
+
+ removeDirectory jtest
+ string map [list $f @] $msg
+} {Error in constructor: couldn't open "@": permission denied}
+
+test tie-file-1.7 {file creation, ok args, uncreateable file} {knownBug winOnly notRoot} {
+ set d [makeDirectory jtest]
+ set f [makeFile {} jtest/journal]
+ removeFile jtest/journal
+ file attributes $d -readonly 1
+
+ catch {tie::std::file x $f} msg
+
+ removeFile jtest/journal
+ removeDirectory jtest
+ string map [list $f @] $msg
+} {Error in constructor: couldn't open "@": permission denied}
+
+test tie-file-1.8 {file creation, fixed name, array} {
+ set f [makeFile {} journal]
+ set msg [tie::std::file x $f]
+ x destroy
+ removeFile journal
+ set msg
+} {::x}
+
+test tie-file-1.9 {file creation, %AUTO%} {
+ set f [makeFile {} journal]
+ set msg [tie::std::file %AUTO% $f]
+ $msg destroy
+ removeFile journal
+ string match ::file\[679] $msg
+} 1
+
+# -------------------------------------------------------------------------
+## Methods
+
+test tie-file-2.0 {file get, wrong#args} {
+ set f [makeFile {array set {b 2 a 1}} journal]
+ tie::std::file x $f
+ catch {x get a} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodget type selfns win self"}
+
+test tie-file-2.1 {file get} {
+ set f [makeFile {array set {b 2 a 1}} journal]
+ tie::std::file x $f
+ set res [dictsort [x get]]
+ x destroy
+ removeFile journal
+ set res
+} {a 1 b 2}
+
+
+test tie-file-3.0 {file set, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x set} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodset type selfns win self dict"}
+
+test tie-file-3.1 {file set, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x set a b} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodset type selfns win self dict"}
+
+test tie-file-3.2 {file set} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ lappend res [x set {c 3 b 2 a 1}]
+ lappend res [viewFile journal]
+ x destroy
+ removeFile journal
+ set res
+} {{} {
+array set {c 3 b 2 a 1}}}
+
+
+test tie-file-4.0 {file names, wrong#args} {
+ set f [makeFile {array set {b 2 a 1}} journal]
+ tie::std::file x $f
+ catch {x names a} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodnames type selfns win self"}
+
+test tie-file-4.1 {file names} {
+ set f [makeFile {array set {b 2 a 1}} journal]
+ tie::std::file x $f
+ set res [lsort [x names]]
+ x destroy
+ removeFile journal
+ set res
+} {a b}
+
+
+test tie-file-5.0 {file size, wrong#args} {
+ set f [makeFile {array set {b 2 a 1}} journal]
+ tie::std::file x $f
+ catch {x size a} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodsize type selfns win self"}
+
+test tie-file-5.1 {file size} {
+ set f [makeFile {array set {b 2 a 1}} journal]
+ tie::std::file x $f
+ set res [x size]
+ x destroy
+ removeFile journal
+ set res
+} 2
+
+
+test tie-file-6.0 {file unset, wrong#args} {
+ set f [makeFile {array set {foo bar fox snarf a 3}} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x unset a b} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodunset type selfns win self ?pattern?"}
+
+test tie-file-6.1 {file unset, default pattern} {
+ set f [makeFile {array set {foo bar fox snarf a 3}} journal]
+ tie::std::file x $f
+ set res {}
+ lappend res [x unset]
+ lappend res [viewFile journal]
+ x destroy
+ removeFile journal
+ set res
+} {{} {array set {foo bar fox snarf a 3}
+array unset *}}
+
+test tie-file-6.2 {file unset, by pattern} {
+ set f [makeFile {array set {foo bar fox snarf a 3}} journal]
+ tie::std::file x $f
+ set res {}
+ lappend res [x unset f*]
+ lappend res [viewFile journal]
+ x destroy
+ removeFile journal
+ set res
+} {{} {array set {foo bar fox snarf a 3}
+array unset f*}}
+
+
+test tie-file-7.0 {file getv, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x getv} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodgetv type selfns win self index"}
+
+test tie-file-7.1 {file getv, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x getv a b} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodgetv type selfns win self index"}
+
+test tie-file-7.2 {file getv} {
+ set f [makeFile {array set {a 3 b 4}} journal]
+ tie::std::file x $f
+ set res {}
+ lappend res [x getv a]
+ x destroy
+ removeFile journal
+ set res
+} 3
+
+
+test tie-file-8.0 {file setv, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x setv} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodsetv type selfns win self index value"}
+
+test tie-file-8.1 {file setv, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x setv a} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodsetv type selfns win self index value"}
+
+test tie-file-8.2 {file setv, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x setv a b c} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodsetv type selfns win self index value"}
+
+test tie-file-8.3 {file setv} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ lappend res [x setv fox snarf]
+ lappend res [viewFile journal]
+ x destroy
+ removeFile journal
+ set res
+} {{} {
+set fox snarf}}
+
+
+test tie-file-9.0 {file unsetv, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x unsetv} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodunsetv type selfns win self index"}
+
+test tie-file-9.1 {file unsetv, wrong#args} {
+ set f [makeFile {} journal]
+ tie::std::file x $f
+ set res {}
+ catch {x unsetv a b} msg
+ x destroy
+ removeFile journal
+ set msg
+} {wrong # args: should be "::tie::std::file::Snit_methodunsetv type selfns win self index"}
+
+test tie-file-9.2 {file unsetv} {
+ set f [makeFile {array set {a 3 b 4}} journal]
+ tie::std::file x $f
+ set res {}
+ lappend res [x unsetv a]
+ lappend res [viewFile journal]
+ x destroy
+ removeFile journal
+ set res
+} {{} {array set {a 3 b 4}
+unset a}}
+
+# -------------------------------------------------------------------------
+## File compaction
+
+test tie-file-10.0 {file compaction} {
+ set f [makeFile {
+ set aa 3
+ set ab 4
+ set ac 5
+ set ad 6
+ set ae 7
+ set f 8
+ array unset a*
+ } journal] ; # {}
+ tie::std::file x $f
+ x names ; # This loads the journal and causes compaction
+ x destroy
+ set res [viewFile journal]
+ removeFile journal
+ set res
+} {array set {f 8}}
+
+test tie-file-10.1 {file compaction, not} {
+ set f [makeFile {
+ set aa 3
+ set ab 4
+ set ac 5
+ set ad 6
+ set ae 7
+ } journal] ; # {}
+ tie::std::file x $f
+ x names ; # This loads the journal and causes compaction
+ x destroy
+ set res [viewFile journal]
+ removeFile journal
+ set res
+} {
+ set aa 3
+ set ab 4
+ set ac 5
+ set ad 6
+ set ae 7
+ }
+
+testsuiteCleanup
+return