From: Leopold Toetsch <[EMAIL PROTECTED]>
Date: Sun, 1 May 2005 11:18:47 +0200
Bob Rogers <[EMAIL PROTECTED]> wrote:
> I have started writing a t/op/n_arithmetics.t test, based directly on
> t/op/arithmetics.t.
Great, thanks.
No problem. See attached. It should cover everything that is covered
in arithmetics.t that makes sense for the n_* ops. Is there anything
missing?
> ... But I notice that if I try
> P0 = n_add P0, 1
> I get the error:
Accidentally converted to an inplace operation. Is fixed here already.
I'll committ it RSN.
I notice this case works now, so it's covered; thanks.
From: Leopold Toetsch <[EMAIL PROTECTED]>
Date: Sun, 01 May 2005 10:51:27 +0200
Bob Rogers wrote:
> Also, I notice that n_ceil and n_floor are not implemented. Should
> they be?
floor, ceil is currently implemented for native types only. As long as
we don't have PMC variants, we don't have n_ceil and n_floor either.
OK; I wasn't paying attention, it seems.
I don't know, if we need PMC variants and vtable functions.
The semantics of floor and ceil are pretty close to the metal anyway, so
I'm not sure what PMC versions would buy, other than convenience. I'll
assume the decision is therefore "no" -- until decided otherwise, of
course. ;-}
-- Bob Rogers
http://rgrjr.dyndns.org/
#! perl -w
# Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
# $Id: arithmetics.t 7810 2005-04-12 10:09:05Z leo $
=head1 NAME
t/op/n_arithmetics.t - n_* Arithmetic Ops
=head1 SYNOPSIS
% perl -Ilib t/op/n_arithmetics.t
=head1 DESCRIPTION
Tests basic arithmetic ops that construct a new return value on
various combinations of Parrot integer and number types.
=cut
use Parrot::Test tests => 17;
use Test::More;
###
### Operations on a single INTVAL
###
pir_output_is(<<'CODE', <<OUTPUT, "take the negative of an Integer");
.sub _main @MAIN
P0 = new Integer
## negate zero.
set P0, 0
n_neg P1, P0
print P1
print "\n"
P30 = P1
## negate a positive number.
set P0, 1234567890
n_neg P1, P0
print P1
print "\n"
## check that we are not reusing P1.
ne_addr P30, P1, not_broken
print "Broken!\n"
not_broken:
## negate a negative number.
set P0, -1234567890
P1 = n_neg P0
print P1
print "\n"
.end
CODE
0
-1234567890
1234567890
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "take the absolute value of an Integer");
.sub _main @MAIN
P0 = new Integer
## find absolute zero (so to speak).
set P0, 0
P1 = n_abs P0
print P1
print "\n"
P30 = P1
## find the absolute value of a positive Integer.
set P0, 1234567890
n_abs P1, P0
print P1
print "\n"
## check that we are not reusing P1.
ne_addr P30, P1, not_broken
print "Broken!\n"
not_broken:
## find the absolute value of a negative number.
set P0, -1234567890
n_abs P1, P0
print P1
print "\n"
.end
CODE
0
1234567890
1234567890
OUTPUT
###
### first arg is Integer, second arg is Integer
###
pir_output_is(<<'CODE', <<OUTPUT, "add Integer to Integer");
.sub _main @MAIN
P0 = new Integer
set P0, 4000
P1 = new Integer
set P1, -123
P2 = new Integer
set P2, 666
n_add P2, P0, P1
print P2
print "\n"
P30 = P2
P2 = n_add P0, P1
print P2
print "\n"
## check that we are not reusing P2.
ne_addr P30, P2, not_broken
print "Broken!\n"
not_broken:
## check adding constants.
P2 = n_add P0, 11
print P2
print "\n"
P0 = n_add P0, 11
print P0
print "\n"
.end
CODE
3877
3877
4011
4011
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "subtract Integer from Integer");
.sub _main @MAIN
P0 = new Integer
set P0, 4000
P1 = new Integer
set P1, -123
P2 = new Integer
set P2, 666
n_sub P2, P0, P1
print P2
print "\n"
P30 = P2
P2 = n_sub P0, P1
print P2
print "\n"
## check that we are not reusing P2.
ne_addr P30, P2, not_broken
print "Broken!\n"
not_broken:
## check subtracting constants.
P2 = n_sub P0, 11
print P2
print "\n"
P0 = n_sub P0, 11
print P0
print "\n"
.end
CODE
4123
4123
3989
3989
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "multiply Integer with Integer");
.sub _main @MAIN
P0 = new Integer
set P0, 4000
P1 = new Integer
set P1, -123
P2 = new Integer
set P2, 666
n_mul P2, P0, P1
print P2
print "\n"
P3 = n_mul P0, P1
print P3
print "\n"
## check multiplying constants.
P2 = n_mul P0, 11
print P2
print "\n"
P0 = n_mul P0, 11
print P0
print "\n"
.end
CODE
-492000
-492000
44000
44000
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "divide Integer by Integer");
.sub _main @MAIN
P0 = new Integer
set P0, 4000
P1 = new Integer
set P1, -123
P2 = new Integer
set P2, 666
n_div P2, P0, P1
print P2
print "\n"
P3 = n_div P0, P1
print P3
print "\n"
## check dividing by constants.
P2 = n_div P0, 11
print P2
print "\n"
P0 = n_div P0, 11
print P0
print "\n"
.end
CODE
-32.5203
-32.5203
363.636
363.636
OUTPUT
###
### Operations on a single NUMVAL
###
pir_output_is(<<'CODE', <<OUTPUT, "negate a Float");
.sub _main @MAIN
P0 = new Float
set P0, 0
P1 = n_neg P0
print P1
print "\n"
set P0, -0.0
n_neg P1, P0
print P1
print "\n"
set P0, 123.4567890
P1 = n_neg P0
print P1
print "\n"
set P0, -123.4567890
n_neg P1, P0
print P1
print "\n"
.end
CODE
0
0
-123.457
123.457
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "take the absolute value of a Float");
.sub _main @MAIN
P0 = new Integer
set P0, 0
P1 = n_abs P0
print P1
print "\n"
set P0, -0.0
n_abs P1, P0
print P1
print "\n"
set P0, 123.45678901
n_abs P1, P0
print P1
print "\n"
set P0, -123.45678901
P1 = n_abs P0
print P1
print "\n"
.end
CODE
0
0
123.457
123.457
OUTPUT
###
### FLOATVAL and INTVAL tests
###
pir_output_is(<<'CODE', <<OUTPUT, "add Integer to Float");
.sub _main @MAIN
P10 = new Integer
set P10, 4000
P0 = new Float
set P0, -123.123
n_add P1, P0, P10
print P1
print "\n"
P30 = P1
P1 = n_add P0, P10
print P1
print "\n"
## check that we are not reusing P1.
ne_addr P30, P1, not_broken
print "Broken!\n"
not_broken:
P2 = n_add P10, P0
print P2
print "\n"
P1 = n_add P1, P10
print P1
print "\n"
.end
CODE
3876.88
3876.88
3876.88
7876.88
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "subtract Integer from Float");
.sub _main @MAIN
P10 = new Integer
set P10, 4000
P0 = new Float
set P0, -123.123
n_sub P1, P0, P10
print P1
print "\n"
P30 = P1
P1 = n_sub P0, P10
print P1
print "\n"
## check that we are not reusing P1.
ne_addr P30, P1, not_broken
print "Broken!\n"
not_broken:
P2 = n_sub P10, P0
print P2
print "\n"
P1 = n_sub P1, P10
print P1
print "\n"
.end
CODE
-4123.12
-4123.12
4123.12
-8123.12
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "multiply Float with Integer");
.sub _main @MAIN
P10 = new Integer
set P10, 4000
P0 = new Float
set P0, -123.123
n_mul P1, P0, P10
print P1
print "\n"
P30 = P1
P1 = n_mul P0, P10
print P1
print "\n"
## check that we are not reusing P1.
ne_addr P30, P1, not_broken
print "Broken!\n"
not_broken:
P1 = n_mul P10, P0
print P1
print "\n"
P1 = n_mul P1, -2
print P1
print "\n"
.end
CODE
-492492
-492492
-492492
984984
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "divide Float by Integer");
.sub _main @MAIN
P10 = new Integer
set P10, 4000
P0 = new Float
set P0, -123.123
n_div P1, P0, P10
print P1
print "\n"
P30 = P1
P1 = n_div P0, P10
print P1
print "\n"
## check that we are not reusing P1.
ne_addr P30, P1, not_broken
print "Broken!\n"
not_broken:
P1 = n_div P0, 1
print P1
print "\n"
set P0, 100.000
P1 = n_div P0, 100
print P1
print "\n"
P1 = n_div P1, 0.01
print P1
print "\n"
.end
CODE
-0.0307808
-0.0307808
-123.123
1
100
OUTPUT
###
### FLOATVAL and FLOATVAL tests
###
pir_output_is(<<'CODE', <<OUTPUT, "add Float to Float");
.sub _main @MAIN
P0 = new Float
set P0, 4000.246
P1 = new Float
set P1, -123.123
P2 = new Float
set P2, 6.66
n_add P2, P0, P1
print P2
print "\n"
P30 = P2
P2 = n_add P0, P1
print P2
print "\n"
## check that we are not reusing P2.
ne_addr P30, P2, not_broken
print "Broken!\n"
not_broken:
.end
CODE
3877.12
3877.12
OUTPUT
## This tests n_infix_ic_p_p_nc for n_add, n_sub, n_mul, and n_div. Note that
## there is no n_infix_ic_p_nc_p op; the PMC argument always comes first.
pir_output_is(<<'CODE', <<OUTPUT, "add/sub/mul/div of Float with constants");
.sub _main @MAIN
P0 = new Float
set P0, 4000.246
P1 = new Float
set P1, -123.123
P2 = n_add P1, 6.78
print P2
print "\n"
P2 = n_add P0, 6.78
print P2
print "\n"
P2 = n_mul P1, 6.78
print P2
print "\n"
P2 = n_div P0, 6.78
print P2
print "\n"
.end
CODE
-116.343
4007.03
-834.774
590.007
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "subtract Float from Float");
.sub _main @MAIN
P0 = new Float
set P0, 4000.246
P1 = new Float
set P1, -123.123
P2 = new Float
set P2, 6.66
n_sub P2, P0, P1
print P2
print "\n"
P30 = P2
P2 = n_sub P1, P0
print P2
print "\n"
## check that we are not reusing P2.
ne_addr P30, P2, not_broken
print "Broken!\n"
not_broken:
.end
CODE
4123.37
-4123.37
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "multiply Float with Float");
.sub _main @MAIN
P0 = new Float
set P0, 400.0246
P1 = new Float
set P1, -123.123
P2 = new Float
set P2, 6.66
n_mul P2, P0, P1
print P2
print "\n"
P30 = P2
P2 = n_mul P0, P1
print P2
print "\n"
## check that we are not reusing P2.
ne_addr P30, P2, not_broken
print "Broken!\n"
not_broken:
.end
CODE
-49252.2
-49252.2
OUTPUT
pir_output_is(<<'CODE', <<OUTPUT, "divide Float by Float");
.sub _main @MAIN
P0 = new Float
set P0, 4000.246
P1 = new Float
set P1, -123.123
P2 = new Float
set P2, 6.66
n_div P2, P1, P0
print P2
print "\n"
P30 = P2
P2 = n_div P0, P1
print P2
print "\n"
## check that we are not reusing P2.
ne_addr P30, P2, not_broken
print "Broken!\n"
not_broken:
.end
CODE
-0.0307789
-32.4898
OUTPUT