# New Ticket Created by  Simon Glover 
# Please include the string:  [perl #17896]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=17896 >



 This patch:

  i)  Adds several new tests for PerlHash, specifically:
      - storing scalar PMCs, and retrieving their values into PMC
      registers and into INT/NUM/STRING registers as appropriate

      (Some of this is already tested in the clone test, but really
       deserves a stand-alone test)

      - retrieving undefined values

      - if (PerlHash), unless(PerlHash)

  ii) Removes one test -- the former test no. 1 -- which tests exactly the
  same functionality as a (more complete) later test

  iii) Reorders the tests into a more rational order: we now test simple
  things (like getting & setting STRINGs, INTs & NUMs) near the top, and
  more complex things (clone, compound keys etc.) near the end. I find
  this makes it easier to figure out what we're actually testing.

 Simon

--- t/pmc/perlhash.t.old        Sun Oct 13 10:48:53 2002
+++ t/pmc/perlhash.t    Sun Oct 13 12:04:26 2002
@@ -1,27 +1,59 @@
 #! perl

-use Parrot::Test tests => 17;
+use Parrot::Test tests => 21;
 use Test::More;

-output_is(<<'CODE', <<OUTPUT, "simple set / get");
-       new P0, .PerlHash
-       set S0, "one"
-       set S1, "two"
+output_is(<<CODE, <<OUTPUT, "Initial PerlHash tests");
+       new     P0, .PerlHash

-       set P0[S0], 1           # $P0{one} = 1
-       set P0[S1], 2           # $P0{two} = 2
+       set     P0["foo"], -7
+       set     P0["bar"], 3.5
+       set     P0["baz"], "value"

-       set I0, P0[S0]
-       set I1, P0[S1]
+       set     I0, P0["foo"]
+       set     N0, P0["bar"]
+       set     S0, P0["baz"]
+
+       eq      I0,-7,OK_1
+       print   "not "
+OK_1:  print   "ok 1\\n"
+       eq      N0,3.500000,OK_2
+       print   N0
+OK_2:  print   "ok 2\\n"
+       eq      S0,"value",OK_3
+       print   S0
+OK_3:  print   "ok 3\\n"
+
+        set     S1, "oof"
+        set     S2, "rab"
+        set     S3, "zab"
+
+       set     P0[S1], 7
+       set     P0[S2], -3.5
+       set     P0[S3], "VALUE"
+
+       set     I0, P0[S1]
+       set     N0, P0[S2]
+       set     S0, P0[S3]
+
+       eq      I0,7,OK_4
+       print   "not "
+OK_4:  print   "ok 4\\n"
+       eq      N0,-3.500000,OK_5
+       print   N0
+OK_5:  print   "ok 5\\n"
+       eq      S0,"VALUE",OK_6
+       print   S0
+OK_6:  print   "ok 6\\n"

-       print I0
-       print "\n"
-       print I1
-       print "\n"
        end
 CODE
-1
-2
+ok 1
+ok 2
+ok 3
+ok 4
+ok 5
+ok 6
 OUTPUT

 output_is(<<'CODE', <<OUTPUT, "more than one PerlHash");
@@ -111,6 +143,21 @@ CODE
 2
 OUTPUT

+# NB Next test depends on "key2" hashing to zero, which it does with
+# the current algorithm; if the algorithm changes, change the test!
+
+output_is(<<'CODE', <<OUTPUT, "key that hashes to zero");
+        new P0, .PerlHash
+        set S0, "key2"
+        set P0[S0], 1
+        set I0, P0[S0]
+       print I0
+       print "\n"
+       end
+CODE
+1
+OUTPUT
+
 output_is(<<'CODE', <<OUTPUT, "size of the hash");
        new P0, .PerlHash

@@ -136,50 +183,6 @@ CODE
 2
 OUTPUT

-
-# NB Next test depends on "key2" hashing to zero, which it does with
-# the current algorithm; if the algorithm changes, change the test!
-
-output_is(<<'CODE', <<OUTPUT, "key that hashes to zero");
-        new P0, .PerlHash
-        set S0, "key2"
-        set P0[S0], 1
-        set I0, P0[S0]
-       print I0
-       print "\n"
-       end
-CODE
-1
-OUTPUT
-
-output_is(<<CODE, <<OUTPUT, "Initial PerlHash tests");
-       new     P0, .PerlHash
-
-       set     P0["foo"], -7
-       set     P0["bar"], 3.5
-       set     P0["baz"], "value"
-
-       set     I0, P0["foo"]
-       set     N0, P0["bar"]
-       set     S0, P0["baz"]
-
-       eq      I0,-7,OK_1
-       print   "not "
-OK_1:  print   "ok 1\\n"
-       eq      N0,3.500000,OK_2
-       print   N0
-OK_2:  print   "ok 2\\n"
-       eq      S0,"value",OK_3
-       print   S0
-OK_3:  print   "ok 3\\n"
-
-       end
-CODE
-ok 1
-ok 2
-ok 3
-OUTPUT
-
 output_is(<<CODE, <<OUTPUT, "stress test: loop(set, check)");
        new     P0, .PerlHash

@@ -288,21 +291,6 @@ CODE
 done
 OUTPUT

-output_is(<<CODE, <<OUTPUT, "String as keys");
-        new P0,.PerlHash
-        new P1,.PerlArray
-        new P2,.PerlArray
-        set P1[4],"string"
-        set P0["one"],P1
-        set P2,P0["one"]
-        set S0,P2[4]
-        print S0
-        print "\\n"
-        end
-CODE
-string
-OUTPUT
-
 output_is(<<'CODE', <<OUTPUT, "Testing two hash indices with integers at a time");
       new P0, .PerlHash

@@ -411,6 +399,138 @@ ok 3
 ok 4
 OUTPUT

+
+# So far, we've only used INTVALs, FLOATVALs and STRINGs as values
+# and/or keys. Now we try PMCs.
+
+output_is(<<'CODE', <<OUTPUT, "Setting & getting scalar PMCs");
+      new P0, .PerlHash
+      new P1, .PerlInt
+      new P2, .PerlInt
+
+      set S0, "non-PMC key"
+
+      set P1, 10
+      set P0[S0], P1
+      set P2, P0[S0]
+      eq P2, P1, OK1
+      print "not "
+OK1:  print "ok 1\n"
+
+      set P1, -1234.000000
+      set P0[S0], P1
+      set P2, P0[S0]
+      eq P2, P1, OK2
+      print "not "
+OK2:  print "ok 2\n"
+
+      set P1, "abcdefghijklmnopq"
+      set P0[S0], P1
+      set P2, P0[S0]
+      eq P2, P1, OK3
+      print "not "
+OK3:  print "ok 3\n"
+
+      new P1, .PerlUndef
+      set P0[S0], P1
+      set P2, P0[S0]
+      typeof S1, P2
+      eq S1, "PerlUndef", OK4
+      print "not "
+OK4:  print "ok 4\n"
+
+      end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "Setting scalar PMCs & getting scalar values");
+      new P0, .PerlHash
+      new P1, .PerlInt
+
+      set S0, "A rather large key"
+
+      set I0, 10
+      set P1, I0
+      set P0[S0], P1
+      set I1, P0[S0]
+      eq I1, I0, OK1
+      print "not "
+OK1:  print "ok 1\n"
+
+      set N0, -1234.000000
+      set P1, N0
+      set P0[S0], P1
+      set N1, P0[S0]
+      eq N1, N0, OK2
+      print "not "
+OK2:  print "ok 2\n"
+
+      set S1, "abcdefghijklmnopq"
+      set P1, S1
+      set P0[S0], P1
+      set S2, P0[S0]
+      eq S2, S1, OK3
+      print "not "
+OK3:  print "ok 3\n"
+
+      end
+CODE
+ok 1
+ok 2
+ok 3
+OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "Getting values from undefined keys");
+      new P2, .PerlHash
+
+      set I0, P2["qwerty"]
+      set N0, P2["asdfgh"]
+      set S0, P2["zxcvbn"]
+      set P0, P2["123456"]
+
+      eq, I0, 0, OK1
+      print "not "
+OK1:  print "ok 1\n"
+
+      eq, N0, 0.0, OK2
+      print "not "
+OK2:  print "ok 2\n"
+
+      eq, S0, "", OK3
+      print "not "
+OK3:  print "ok 3\n"
+
+      typeof S1, P0
+      eq S1, "PerlUndef", OK4
+      print "not "
+OK4:  print "ok 4\n"
+      end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+OUTPUT
+
+output_is(<<CODE, <<OUTPUT, "Setting & getting non-scalar PMCs");
+        new P0,.PerlHash
+        new P1,.PerlArray
+        new P2,.PerlArray
+        set P1[4],"string"
+        set P0["one"],P1
+        set P2,P0["one"]
+        set S0,P2[4]
+        print S0
+        print "\\n"
+        end
+CODE
+string
+OUTPUT
+
 output_is(<<'CODE', <<OUTPUT, "Testing clone");
     new P0, .PerlHash
     set S0, "a"
@@ -552,4 +672,77 @@ CODE
 12
 OUTPUT

+# A hash is only false if it has size 0
+
+output_is(<<'CODE', <<OUTPUT, "if (PerlHash)");
+      new P0, .PerlHash
+
+      if P0, BAD1
+      print "ok 1\n"
+      branch OK1
+BAD1: print "not ok 1\n"
+OK1:
+
+      set P0["key"], "value"
+      if P0, OK2
+      print "not "
+OK2:  print "ok 2\n"
+
+      set P0["key"], ""
+      if P0, OK3
+      print "not "
+OK3:  print "ok 3\n"
+
+      new P1, .PerlUndef
+      set P0["key"], P1
+      if P0, OK4
+      print "not "
+OK4:  print "ok 4\n"
+
+      end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "unless (PerlHash)");
+      new P0, .PerlHash
+
+      unless P0, OK1
+      print "not "
+OK1:  print "ok 1\n"
+
+      set P0["key"], "value"
+      unless P0, BAD2
+      print "ok 2\n"
+      branch OK2
+BAD2: print "not ok 2"
+OK2:
+
+      set P0["key"], "\0"
+      unless P0, BAD3
+      print "ok 3\n"
+      branch OK3
+BAD3: print "not ok 3"
+OK3:
+
+      new P1, .PerlUndef
+      set P0["key"], P1
+      unless P0, BAD4
+      print "ok 4\n"
+      branch OK4
+BAD4: print "not ok 4"
+OK4:
+
+      end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+OUTPUT
+
 1;
+



Reply via email to