From 9d8649a5db67e19b15785b8f7f660798e9aa107a Mon Sep 17 00:00:00 2001
From: Jonas Maebe <jonas@freepascal.org>
Date: Wed, 16 Aug 2006 21:37:31 +0000
Subject: [PATCH]   + another packarray test which works

git-svn-id: trunk@4429 -
---
 .gitattributes         |   1 +
 tests/test/tparray6.pp | 294 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 295 insertions(+)
 create mode 100644 tests/test/tparray6.pp

diff --git a/.gitattributes b/.gitattributes
index b2b62a38b7..7be142063f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -6142,6 +6142,7 @@ tests/test/tparray2.pp svneol=native#text/plain
 tests/test/tparray3.pp svneol=native#text/plain
 tests/test/tparray4.pp svneol=native#text/plain
 tests/test/tparray5.pp svneol=native#text/plain
+tests/test/tparray6.pp svneol=native#text/plain
 tests/test/tpftch1.pp svneol=native#text/plain
 tests/test/tprocext.pp svneol=native#text/plain
 tests/test/tprocvar1.pp svneol=native#text/plain
diff --git a/tests/test/tparray6.pp b/tests/test/tparray6.pp
new file mode 100644
index 0000000000..2719f8bcd7
--- /dev/null
+++ b/tests/test/tparray6.pp
@@ -0,0 +1,294 @@
+{$mode macpas}
+
+{$r-}
+
+procedure error(l: longint);
+begin
+  writeln('error near ',l);
+  halt(1);
+end;
+
+procedure test8bit;
+type
+  ta = 0..1;
+  tb = packed array[0..999] of ta;
+  tc = array[0..124] of byte;
+const
+{$ifdef ENDIAN_BIG}
+  results: array[0..9] of ta = (1,0,1,0,1,0,1,0,1,0);
+{$else}
+  results: array[0..9] of ta = (0,1,0,1,0,1,0,1,0,1);
+{$endif}
+var
+  a: ta;
+  b: tb;
+  i: longint;
+begin
+  b[0] := results[0];
+  b[1] := results[1];
+  b[2] := results[2];
+  b[3] := results[3];
+  b[4] := results[4];
+  b[5] := results[5];
+  b[6] := results[6];
+  b[7] := results[7];
+  b[8] := results[8];
+  b[9] := results[9];
+  if (b[0] <> results[0]) then
+    error(1);
+  if (b[1] <> results[1]) then
+    error(2);
+  if (b[2] <> results[2]) then
+    error(3);
+  if (b[3] <> results[3]) then
+    error(4);
+  if (b[4] <> results[4]) then
+    error(5);
+//  if (b[600] <> 1) then
+//    error(6);
+  for i := low(results) to high(results) do
+    if b[i] <> results[i] then
+      error(7);
+//  i := 500;
+//  if (b[i] <> 1) then
+//    error(8);
+end;
+
+
+procedure test8to16bit;
+type
+  ta = 0..7;
+  tb = packed array[0..1000] of ta;
+const
+{$ifdef ENDIAN_BIG}
+{ 010 110 100 101 101 001 011 010 010 11010010110100101101001011010 }
+
+  results: array[0..5] of ta = (2,6,4,5,5,1);
+{$else}
+{ (memory layout is different but equivalent with starting at end }
+{ 01011010010110100101101001011 010 010 110 100 101 101 001 011 010 }
+  results: array[0..5] of ta = (2,3,1,5,5,4);
+{$endif}
+var
+  a: ta;
+  b: tb;
+  i: longint;
+begin
+  b[0] := results[0];
+  b[1] := results[1];
+  b[2] := results[2];
+  b[3] := results[3];
+  b[4] := results[4];
+  b[5] := results[5];
+  if (b[0] <> results[0]) then
+    error(11);
+  if (b[1] <> results[1]) then
+    error(12);
+  if (b[2] <> results[2]) then
+    error(13);
+  if (b[3] <> results[3]) then
+    error(14);
+  if (b[4] <> results[4]) then
+    error(15);
+  if (b[5] <> results[5]) then
+    error(155);
+//  if (b[600] <> 2) then
+//    error(16);
+  for i := low(results) to high(results) do
+    if b[i] <> results[i] then
+      error(17);
+//  i := 500;
+//  if (b[i] <> 5) then
+//    error(18);
+end;
+
+
+procedure test16bit;
+type
+  ta = 0..511;
+  tb = packed array[0..799] of ta;
+  tc = array[0..899] of byte;
+const
+{$ifdef ENDIAN_BIG}
+  { 010110100 111011001 011010011 101100101 101001110 110010110 100111011 001011010 0111011001011010011101100101101001110110 }
+  results: array[0..4] of ta = ($5A*2,$76 * 4 + 1,$69 * 2 + 1,$B2 * 2 + 1,$A7 * 2);
+{$else}
+  { algorithm: cut bit string in 16 bit chunks, byteswap, take 9 bits from right to left per chunck, continuing at the right of the next chunck if the previous one is used up }
+  { 001011010 100111011 110010110 101001110 101100101 011 0101101001110110010110100111011001011010011101100101101001110110 }
+
+  results: array[0..4] of ta = ($2D*2,$9D*2+1,$CB*2,$A7*2,$B2*2+1);
+{$endif}
+var
+  a: ta;
+  b: tb;
+  i: longint;
+begin
+  b[0] := results[0];
+  b[1] := results[1];
+  b[2] := results[2];
+  b[3] := results[3];
+  b[4] := results[4];
+  if (b[0] <> results[0]) then
+    error(21);
+  if (b[1] <> results[1]) then
+    error(22);
+  if (b[2] <> results[2]) then
+    error(23);
+  if (b[3] <> results[3]) then
+    error(24);
+  if (b[4] <> results[4]) then
+    error(25);
+//  if (b[600] <> $76 * 2) then
+//    error(26);
+  for i := low(results) to high(results) do
+    if b[i] <> results[i] then
+      error(27);
+//  i := 500;
+//  if (b[i] <> $A7 * 2) then
+//    error(28);
+end;
+
+procedure test16to24bit;
+type
+  ta = 0..2047;
+  tb = packed array[0..799] of ta;
+  tc = array[0..1099] of byte;
+const
+{$ifdef ENDIAN_BIG}
+  results: array[0..4] of ta = ($5A * 8 + 3,$B2 * 8 + 6,$9D * 8 + 4,$B4 * 8 + 7,$65 * 8 + 5);
+{$else}
+  {  %11001011010 01101001110 00111011001  01100101101 10110100111 011101100 0111011001011010 0111011001011010 0111011001011010 }
+  results: array[0..4] of ta = ($0000065A,$0000034E,$000001D9,$0000032D,$000005A7);
+{$endif}
+var
+  a: ta;
+  b: tb;
+  i: longint;
+begin
+  b[0] := results[0];
+  b[1] := results[1];
+  b[2] := results[2];
+  b[3] := results[3];
+  b[4] := results[4];
+  if (b[0] <> results[0]) then
+    error(31);
+  if (b[1] <> results[1]) then
+    error(32);
+  if (b[2] <> results[2]) then
+    error(33);
+  if (b[3] <> results[3]) then
+    error(34);
+  if (b[4] <> results[4]) then
+    error(35);
+//  if (b[600] <> $76 * 8 + 2) then
+//    error(36);
+  for i := low(results) to high(results) do
+    if b[i] <> results[i] then
+      error(37);
+//  i := 500;
+//  if (b[i] <> $65 * 8 + 5) then
+//    error(38);
+end;
+
+
+procedure test32bit;
+type
+  ta = 0..(1 shl 19) - 1;
+  tb = packed array[0..799] of ta;
+  tc = array[0..1899] of byte;
+const
+{$ifdef ENDIAN_BIG}
+  results: array[0..4] of ta = ($5A76*8+2, $D3B2*8+6,$9D96*8+4,$ECB4*8+7,$65A7*8+3);
+{$else}
+  {  0100111011001011010 0110100111011001011  0010110100111011001 0110010110100111011 1110110010110100111 0  01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010}
+  results: array[0..4] of ta = ($0002765A,$00034ECB,$000169D9,$00032D3B,$000765A7);
+{$endif}
+var
+  a: ta;
+  b: tb;
+  i: longint;
+begin
+  b[0] := results[0];
+  b[1] := results[1];
+  b[2] := results[2];
+  b[3] := results[3];
+  b[4] := results[4];
+  if (b[0] <> results[0]) then
+    error(41);
+  if (b[1] <> results[1]) then
+    error(42);
+  if (b[2] <> results[2]) then
+    error(43);
+  if (b[3] <> results[3]) then
+    error(44);
+  if (b[4] <> results[4]) then
+    error(45);
+//  if (b[600] <> $765A*8+3) then
+//    error(46);
+  for i := low(results) to high(results) do
+    if b[i] <> results[i] then
+      error(47);
+//  i := 500;
+//  if (b[i] <> $65a7*8+3) then
+//    error(48);
+end;
+
+{
+  write(hexstr(%1110110010110100111011001011010 ,8),',$');
+  write(hexstr(%1101100101101001110110010110100 ,8),',$');
+  write(hexstr(%1011001011010011101100101101001 ,8),',$');
+  write(hexstr(%0110010110100111011001011010011 ,8),',$');
+  writeln(hexstr(%1100101101001110110010110100111 ,8));
+}
+
+
+procedure test32to40bit;
+type
+  ta = 0..$7fffffff;
+  tb = packed array[0..799] of ta;
+  tc = array[0..3099] of byte;
+const
+{$ifdef ENDIAN_BIG}
+  results: array[0..4] of ta = ($5A765A7*8+3,$2D3B2D3*8+5,$969D969*8+6,$CB4ECB4*8+7,$65A765A*8+3);
+{$else}
+{
+1110110010110100111011001011010 1101100101101001110110010110100 1011001011010011101100101101001 0110010110100111011001011010011 1100101101001110110010110100111 1001011010011101100101101001110 011101
+}
+  results: array[0..4] of ta = ($765A765A,$6CB4ECB4,$5969D969,$32D3B2D3,$65A765A7);
+{$endif}
+var
+  a: ta;
+  b: tb;
+  i: longint;
+begin
+  b[0] := results[0];
+  b[1] := results[1];
+  b[2] := results[2];
+  b[3] := results[3];
+  b[4] := results[4];
+  if (b[0] <> results[0]) then
+    error(51);
+  if (b[1] <> results[1]) then
+    error(52);
+  if (b[2] <> results[2]) then
+    error(53);
+  if (b[3] <> results[3]) then
+    error(54);
+  if (b[4] <> results[4]) then
+    error(55);
+  for i := low(results) to high(results) do
+    if b[i] <> results[i] then
+      error(57);
+//  i := 500;
+//  if (b[i] <> $65A765A*8+3) then
+//    error(58);
+end;
+
+begin
+  test8bit;
+  test8to16bit;
+  test16bit;
+  test16to24bit;
+  test32bit;
+  test32to40bit;
+end.