Selaa lähdekoodia

+ a lot more qword tests: mod/int_str/const/type cast/io
* better div/mul tests

florian 26 vuotta sitten
vanhempi
commit
bdb336a4a3
1 muutettua tiedostoa jossa 310 lisäystä ja 10 poistoa
  1. 310 10
      tests/testi642.pp

+ 310 - 10
tests/testi642.pp

@@ -494,7 +494,7 @@ procedure testdivqword;
        end;
        end;
      for i:=1 to 100000 do
      for i:=1 to 100000 do
        begin
        begin
-          tqwordrec(q1).high:=random($7ffffffe);
+          tqwordrec(q1).high:=0;
           tqwordrec(q1).low:=random($7ffffffe);
           tqwordrec(q1).low:=random($7ffffffe);
           tqwordrec(q2).high:=0;
           tqwordrec(q2).high:=0;
           tqwordrec(q2).low:=random($7ffffffe);
           tqwordrec(q2).low:=random($7ffffffe);
@@ -502,10 +502,9 @@ procedure testdivqword;
           if tqwordrec(q2).low=0 then
           if tqwordrec(q2).low=0 then
             tqwordrec(q2).low:=1;
             tqwordrec(q2).low:=1;
           { get a restless division }
           { get a restless division }
-          q3:=q1 div q2;
-          q1:=q2*q3;
-          q3:=q1 div q2;
-          if q3*q2<>q1 then
+          q3:=q1*q2;
+          q3:=q3 div q2;
+          if q3<>q1 then
             begin
             begin
                write('Division of ');
                write('Division of ');
                dumpqword(q1);
                dumpqword(q1);
@@ -530,7 +529,7 @@ function testf : qword;
      testf:=q;
      testf:=q;
   end;
   end;
 
 
-procedure testfuncword;
+procedure testfuncqword;
 
 
   var
   var
      q : qword;
      q : qword;
@@ -543,6 +542,280 @@ procedure testfuncword;
        do_error(1901);       
        do_error(1901);       
   end;
   end;
 
 
+procedure testtypecastqword;
+
+  var
+     s1,s2 : shortint;
+     b1,b2 : byte;
+     w1,w2 : word;
+     i1,i2 : integer;
+     l1,l2 : longint;
+     d1,d2 : dword;
+     q1,q2 : qword;
+
+  begin
+     { shortint }
+     s1:=75;
+     s2:=0;
+     q1:=s1;
+     { mix up the processor a little bit }
+     q2:=q1;
+     if q2<>75 then
+       begin
+          dumpqword(q2);
+          do_error(2006);          
+       end;
+     s2:=q2;
+     if s1<>s2 then
+       do_error(2000);
+
+     { byte }
+     b1:=$ca;
+     b2:=0;
+     q1:=b1;
+     { mix up the processor a little bit }
+     q2:=q1;
+     if q2<>$ca then
+       do_error(2007);
+     b2:=q2;
+     if b1<>b2 then
+       do_error(2001);
+
+     { integer }
+     i1:=12345;
+     i2:=0;
+     q1:=i1;
+     { mix up the processor a little bit }
+     q2:=q1;
+     if q2<>12345 then
+       do_error(2008);
+     i2:=q2;
+     if i1<>i2 then
+       do_error(2002);
+
+     { word }
+     w1:=$a0ff;
+     w2:=0;
+     q1:=w1;
+     { mix up the processor a little bit }
+     q2:=q1;
+     if q2<>$a0ff then
+       do_error(2009);
+     w2:=q2;
+     if w1<>w2 then
+       do_error(2003);
+
+     { longint }
+     l1:=12341234;
+     l2:=0;
+     q1:=l1;
+     { mix up the processor a little bit }
+     q2:=q1;
+     if q2<>12341234 then
+       do_error(2010);
+     l2:=q2;
+     if l1<>l2 then
+       do_error(2004);
+
+     { dword }
+     d1:=$5bcdef01;
+     b2:=0;
+     q1:=d1;
+     { mix up the processor a little bit }
+     q2:=q1;
+     if q2<>$5bcdef01 then
+       do_error(2011);
+     d2:=q2;
+     if d1<>d2 then
+       do_error(2005);
+  end;
+
+procedure testioqword;
+
+  var
+     t : text;
+     q1,q2 : qword;
+     i : longint;
+
+  begin
+     assignqword($ffffffff,$a0a0a0a0,q1);
+     assign(t,'testi642.tmp');
+     rewrite(t);
+     writeln(t,q1);
+     close(t);
+     reset(t);
+     readln(t,q2);
+     close(t);
+     if q1<>q2 then
+       do_error(2100);
+     { do some random tests }
+     for i:=1 to 100 do
+       begin
+          tqwordrec(q1).high:=random($7ffffffe);
+          tqwordrec(q1).low:=random($7ffffffe);          
+          rewrite(t);
+          writeln(t,q1);
+          close(t);
+          reset(t);
+          readln(t,q2);
+          close(t);
+          if q1<>q2 then
+            begin
+               write('I/O of ');dumpqword(q1);writeln(' failed');
+               do_error(2101);
+            end;
+       end;
+  end;
+  
+procedure teststringqword;
+
+  var
+     q1,q2 : qword;
+     s : string;
+     l : longint;
+
+  begin
+     { testing str }
+     // simple tests
+     q1:=1;
+     int_str(q1,s);
+     if s<>'1' then
+       do_error(2200);
+     // simple tests
+     q1:=0;
+     int_str(q1,s);
+     if s<>'0' then
+       do_error(2201);
+
+     // more complex tests 
+     q1:=4321;
+     int_str(q1,s);
+     if s<>'4321' then
+       do_error(2202);
+
+     // create a big qword:
+     q2:=1234;
+     l:=1000000000;
+     q2:=q2*l;
+     l:=54321;
+     q2:=q2+l;
+     int_str(q2,s);
+     if s<>'1234000054321' then
+       do_error(2203);
+     { testing val }
+     { !!!!!!!     }
+  end;
+
+procedure testmodqword;
+
+  var
+     q0,q1,q2,q3,q4,q5,q6 : qword;
+     i : longint;
+
+  begin
+     assignqword(0,0,q0);
+     assignqword(0,3,q1);
+     assignqword(0,5,q2);
+     assignqword(0,2,q3);
+     assignqword(0,4,q4);
+     assignqword(0,1,q5);
+     assignqword($ffff,$12344321,q6);
+     { to some trivial tests       }
+     { to test the code generation }
+     if q2 mod q1<>q3 then
+       do_error(2300);
+     if q2 mod q1 mod q3<>q0 then
+       do_error(2301);
+     if q2 mod (q1 mod q3)<>q0 then
+       do_error(2302);
+     if (q1 mod q3) mod q2<>q5 then
+       do_error(2303);
+
+     { a more complex expression }
+     if (q2 mod q4) mod (q1 mod q3)<>(q1 mod q3) mod (q2 mod q4) then
+       do_error(2304);
+     
+     { now test the modulo division procedure with random bit patterns }
+     writeln('Doing some random module divisions, takes a few seconds');
+     writeln('.................100%');
+     for i:=1 to 100000 do
+       begin
+          tqwordrec(q1).high:=random($7ffffffe);
+          tqwordrec(q1).low:=random($7ffffffe);
+          tqwordrec(q2).high:=random($7ffffffe);
+          tqwordrec(q2).low:=random($7ffffffe);
+          { avoid division by zero }
+          if (tqwordrec(q2).low or tqwordrec(q2).high)=0 then
+            tqwordrec(q2).low:=1;
+          q3:=q1 mod q2;
+          if (q1-q3) mod q2<>q0 then
+            begin
+               write('Modulo division of ');
+               dumpqword(q1);
+               write(' by ');
+               dumpqword(q2);
+               writeln(' failed');
+               do_error(2306);
+            end;
+          if i mod 10000=0 then
+            write('.');
+       end;
+     for i:=1 to 100000 do
+       begin
+          tqwordrec(q1).high:=random($7ffffffe);
+          tqwordrec(q1).low:=random($7ffffffe);
+          tqwordrec(q2).high:=0;
+          tqwordrec(q2).low:=random($7ffffffe);
+          { avoid division by zero }
+          if tqwordrec(q2).low=0 then
+            tqwordrec(q2).low:=1;
+          { get a restless division }
+          q3:=q1 mod q2;
+          if (q1-q3) mod q2<>q0 then
+            begin
+               write('Modulo division of ');
+               dumpqword(q1);
+               write(' by ');
+               dumpqword(q2);
+               writeln(' failed');
+               do_error(2307);
+            end;
+          if i mod 10000=0 then
+            write('.');
+       end;
+     writeln(' OK');
+  end;
+
+const
+   constqword : qword = 131975;
+
+procedure testconstassignqword;
+
+  var
+     q1,q2,q3 : qword;
+
+  begin
+     // constant assignments
+     assignqword(0,5,q2);
+     q1:=5;
+     if q1<>q2 then
+       do_error(2400);
+
+     // constants in expressions
+     q1:=1234;
+     if q1<>1234 then
+       do_error(2401);
+
+     // typed constants 
+     assignqword(0,131975,q1);
+     q2:=131975;
+     if q1<>q2 then
+       do_error(2402);
+
+     //!!!!! large constants are still missed 
+  end;
+
+
 var
 var
    q : qword;
    q : qword;
 
 
@@ -581,6 +854,11 @@ begin
    writeln('Testing QWord subtraction was successful');
    writeln('Testing QWord subtraction was successful');
    writeln;
    writeln;
 
 
+   writeln('Testing QWord constants');
+   testconstassignqword;
+   writeln('Testing QWord constants was successful');
+   writeln;
+
    writeln('Testing QWord logical operators (or,xor,and)');
    writeln('Testing QWord logical operators (or,xor,and)');
    testlogqword;
    testlogqword;
    writeln('Testing QWord logical operators (or,xor,and) was successful');
    writeln('Testing QWord logical operators (or,xor,and) was successful');
@@ -597,19 +875,41 @@ begin
    writeln;
    writeln;
 
 
    writeln('Testing QWord function results');
    writeln('Testing QWord function results');
-   testfuncword;
+   testfuncqword;
    writeln('Testing QWord function results was successful');
    writeln('Testing QWord function results was successful');
    writeln;
    writeln;
 
 
-   writeln('Testing QWord division');
-   testdivqword;
-   writeln('Testing QWord division was successful');
+   writeln('Testing QWord type casts');
+   testtypecastqword;
+   writeln('Testing QWord type casts was successful');
    writeln;
    writeln;
 
 
+   {!!!!!!
    writeln('Testing QWord multiplications');
    writeln('Testing QWord multiplications');
    testmulqword;
    testmulqword;
    writeln('Testing QWord multiplications was successful');
    writeln('Testing QWord multiplications was successful');
    writeln;
    writeln;
+   }
+
+   writeln('Testing QWord division');
+   testdivqword;
+   writeln('Testing QWord division was successful');
+   writeln;
+
+   writeln('Testing QWord modulo division');
+   testmodqword;
+   writeln('Testing QWord modulo division was successful');
+   writeln;
+
+   writeln('Testing QWord string conversion');
+   teststringqword;
+   writeln('Testing QWord string conversion was successful');
+   writeln;
+
+   writeln('Testing QWord input/output');
+   testioqword;
+   writeln('Testing QWord input/output was successful');
+   writeln;
 
 
    writeln('------------------------------------------------------');
    writeln('------------------------------------------------------');
    writeln('              QWord test successful');
    writeln('              QWord test successful');