cvsuser 04/09/01 17:52:46
Modified: t/pmc nci.t
Log:
this patch adds two tests to t/pmc/nci.t.
The first new test should be a platform independent check of get_string() of
the
ParrotLibrary PMC.
The second new test is a callback test ported from PASM to PIR.
Courtesy of Bernhard Schmalhofer <[EMAIL PROTECTED]>
Revision Changes Path
1.48 +121 -21 parrot/t/pmc/nci.t
Index: nci.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/nci.t,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -w -r1.47 -r1.48
--- nci.t 31 Aug 2004 09:14:31 -0000 1.47
+++ nci.t 2 Sep 2004 00:52:46 -0000 1.48
@@ -1,6 +1,6 @@
#! perl -w
# Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-# $Id: nci.t,v 1.47 2004/08/31 09:14:31 leo Exp $
+# $Id: nci.t,v 1.48 2004/09/02 00:52:46 dan Exp $
=head1 NAME
@@ -12,12 +12,12 @@
=head1 DESCRIPTION
-Tests the NCI PMC. These are all skipped unless the F<libnci.so>
-library is found.
+This tests the Native Call Interface, that is the ParrotLibrary PMC.
+The tests are all skipped unless the F<libnci.so> library is found.
=cut
-use Parrot::Test tests => 35;
+use Parrot::Test tests => 37;
use Parrot::Config;
SKIP: {
@@ -56,26 +56,52 @@
ok 2
OUTPUT
-output_is(<<'CODE', <<'OUTPUT', "nci_d_d - PIR");
+output_is( << 'CODE', << 'OUTPUT', "nci_dd in PIR" );
##PIR##
.sub _test @MAIN
- .local pmc lib
- .local NCI dd
- lib = loadlib "libnci"
- unless lib goto NOT_LOADED
- print "loaded "
- print lib
- print "\n"
- dd = dlfunc lib, "nci_dd", "dd"
+ .local string library_name
+ library_name = 'libnci'
+ .local pmc libnci
+ libnci = loadlib library_name
+ unless libnci goto NOT_LOADED
+ print library_name
+ print " was successfully loaded\n"
+ .local pmc twice
+ twice = dlfunc libnci, "nci_dd", "dd"
.local float r
- r = dd(4.0)
+ r = twice( -4.128 )
print r
NOT_LOADED:
print "\n"
.end
CODE
-loaded runtime/parrot/dynext/libnci.so
-8.000000
+libnci was successfully loaded
+-8.256000
+OUTPUT
+
+output_is( << 'CODE', << "OUTPUT", "get_string()" );
+##PIR##
+.sub _test @MAIN
+ .local string library_name
+ library_name = 'libnci'
+ .local pmc libnci
+ libnci = loadlib library_name
+ unless libnci goto NOT_LOADED
+ .local string filename_with_path
+ filename_with_path = libnci
+ # depending on the platform, 'filename' has path info or not
+ .local int start_of_filename
+ start_of_filename = index filename_with_path, 'libnci'
+ if start_of_filename == -1 goto NOT_LOADED
+ .local string filename
+ filename = substr filename_with_path, start_of_filename
+ print filename
+ print " was successfully loaded"
+ NOT_LOADED:
+ print "\n"
+.end
+CODE
+libnci$PConfig{so} was successfully loaded
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "nci_f_ff");
@@ -976,6 +1002,80 @@
done.
OUTPUT
+output_is(<<'CODE', <<'OUTPUT', "nci_cb_C1 in PIR");
+##PIR##
+.sub _test @MAIN
+
+ # this flag will be set by the callback function
+ .local pmc cb_done
+ cb_done = new Integer
+ cb_done = 0
+ store_global "cb_done", cb_done
+
+ # this callback function will eventually by called by the library
+ .local pmc cb
+ cb = newsub _call_back
+
+ # prepare user data
+ .local pmc user_data
+ user_data = new Integer
+ user_data = 42
+
+ # A Sub that can be given to the library
+ .local pmc cb_wrapped
+ cb_wrapped = new_callback cb, user_data, "tU" # Z in pdd16
+ print "created a callback sub\n"
+
+ # now call the external sub, that takes a callback and user data
+ .local pmc libnci
+ libnci = loadlib "libnci"
+ .local pmc nci_cb_C1
+ nci_cb_C1 = dlfunc libnci, "nci_cb_C1", "vpP"
+ print "loaded a function that takes a callback\n"
+ nci_cb_C1( cb_wrapped, user_data )
+
+ # callback will be called at any time
+ # so spin a bit
+ .local int sleep_cnt
+ sleep_cnt = 0
+LOOP:
+ sleep_cnt += 1
+ sleep 0.01
+ .local pmc callback_has_run
+ callback_has_run = find_global "cb_done"
+ if callback_has_run goto FINISHED
+ if sleep_cnt > 10 goto ERROR
+ goto LOOP
+FINISHED:
+ print "the callback has run\n"
+ end
+ERROR:
+ print "the callback didnt run\n"
+ end
+.end
+
+.sub _call_back
+ print "in callback\n"
+ print "user data: "
+ print P5
+ print "\n"
+ print "external data: "
+ print S5
+ print "\n"
+ find_global P12, "cb_done"
+ inc P12
+ invoke P1
+.end
+
+CODE
+created a callback sub
+loaded a function that takes a callback
+in callback
+user data: 42
+external data: succeeded
+the callback has run
+OUTPUT
+
output_is(<<'CODE', <<'OUTPUT', "nci_cb_D1");
# we need a flag if the call_back is already done
@@ -1343,7 +1443,7 @@
output_is(<< 'CODE', << 'OUTPUT', "check wether interface is done");
##PIR##
-.sub _main
+.sub _test @MAIN
.local pmc pmc1
pmc1 = new ParrotLibrary
.local int bool1