Context Navigation


Find an existing test under t/ that is written use the perl test modules.

parrot tests tend to have a single perl test that generates multiple lines of output; Each of these multiple lines of output needs to be a single test in the parrot model.

For example, here's on old style single test with two outputs.

pir_output_is( <<'CODE', <<'OUT', 'string isa and pmc isa have same result' );
.sub main
 .local pmc class, obj
 class = new 'Class'
 obj = class.'new'()
 $I0 = isa obj, 'Object'
 print $I0
 print "\n"
 .local pmc cl
 cl = new 'String'
 cl = 'Object'
 $I1 = isa obj, cl
 print $I1
 print "\n"
.end
CODE
1
1
OUT

To convert this to pir tests, you simply strip off the surrounding perl wrapper and leave the heredoc; give the sub a unique name, for example, based on your test description.

.sub string_isa_and_pmc_isa_have_same_result
 .local pmc class, obj
 class = new 'Class'
 obj = class.'new'()
 $I0 = isa obj, 'Object'
 print $I0
 print "\n"
 .local pmc cl
 cl = new 'String'
 cl = 'Object'
 $I1 = isa obj, cl
 print $I1
 print "\n"
.end

Next, we need to convert the output to use PIR's test more subs...

.sub string_isa_and_pmc_isa_have_same_result
 .local pmc class, obj
 class = new 'Class'
 obj = class.'new'()
 $I0 = isa obj, 'Object'
 ok ($I0, 'isa Class instance an Object')
 .local pmc cl
 cl = new 'String'
 cl = 'Object'
 $I1 = isa obj, cl
 ok ($I1, 'isa String instance an Object')
.end

Finally, we need a harness to run this sub with the two tests:

.sub main :main
 .include 'include/test_more.pir'
 plan(2)
 string_isa_and_pmc_isa_have_same_result()
.end

Finally, be sure to update the coda to be a PIR coda rather than the perl one.

Here is a brief list of some potential stumbling blocks and ways around them:

  • There are a number of tests which confirm proper error reporting. This can be done in PIR in three ways. The simplest way is to use dies_ok(), throws_like() or throws_substring().
  • You can also create an exception handler and check the exception message.
pasm_error_output_like( <<'CODE', <<'OUTPUT', "Malformed string: real part" );
 new P0, 'Complex'
 set P0, "q + 3i"
 end
CODE
/Complex: malformed string/
OUTPUT

becomes...

.sub exception_malformed_string__imaginary_part
 new P0, 'Complex'
 push_eh handler
 set P0, "q + 3i"
 pop_eh
handler:
 .local pmc exception
 .local string message
 .get_results (exception)
 message = exception['message']
 is( message, 'Complex: malformed string', 'Complex: malformed string' )
.end

Finally, you can create a EventHandler PMC and check for the appropriate error type. See t/pmc/ro.t for an example. This method may be preferable

  • Some tests create new classes and add methods to those namespaces. In a consolidated file you will need to make sure the new class names don't collide (you'll probably find a number of Foo and Bar classes), and you will need to make sure you return to the root namespace after the test completes.
.namespace [] # Return to the root namespace
  • Many tests are skipped based on the operating system. You can test for this in PIR with the following:
 .include "iglobals.pasm" 
 .local pmc config_hash, interp 
 interp = getinterp 
 config_hash = interp[.IGLOBALS_CONFIG_HASH] 
 $S0 = config_hash["os_name"] 
 eq $S0, "MSWin32", win32fail
 ...
 .return()
win32fail:
 skip( 10, 'skipping ___ tests under MSWin' )

AltStyle によって変換されたページ (->オリジナル) /