PRAGMA static;
VAR a:int[],
err, cmp_count, test_count = 0;
PROC swap (m,n :int) IS
VAR e:int;
IF m == n THEN RETURN; END;
e = a[m]; a[m] = a[n]; a[n] = e;
ENDP;
FUNC lt (m,n :int):boolean IS
INC cmp_count;
RETURN a[m] < a[n];
ENDF;
PROC sort5() IS
cmp_count = 0; //0 1 2 3 4
IF lt(0,4) THEN swap(0,4); END; //a1 >= a2
IF lt(1,3) THEN swap(1,3); END; // b1 >= b2
IF lt(0,1) THEN swap(0,1); swap(3,4); END; //a1>=b1 x b2 a2
IF lt(1,2) THEN swap(1,2);
IF lt(0,1) THEN swap(0,1); END;
ELSE
IF lt(2,3) THEN swap(2,3); END; //a1 >= b1 >= x >= b2, a2
END; //0 1 2 3 4
IF lt(2,4) THEN swap(3,4); swap(2,3); //a1 >= b1 ? a2 >= x >= b2
IF lt(1,2) THEN swap(1,2); END; //a1 >= a2 >= b1 >= x >= b2
ELSE
IF lt(3,4) THEN swap(3,4); END;
END;
ENDP sort5;
PROC test (a0, a1, a2, a3, a4 :int) IS
VAR ok = true;
a[0] = a0; a[1] = a1; a[2] = a2; a[3] = a3; a[4] = a4;
sort5();
FOR i IN [4] DO
IF a < a[i+1] THEN ok = false; END;
ENDFOR;
IF NOT ok OR cmp_count > 7 THEN
PUTF "-- src: %d, %d, %d, %d, %d\n", a0, a1, a2, a3, a4;
PUT "result: "; FOR i IN [5] DO PUTF "%d, ", a; END;
PUTN "";
PUTF "cmp_count= %d \n\n", cmp_count;
INC err;
END;
INC test_count;
ENDPROC;
PROC main() IS
a = NEW int[5];
FOR i IN [5] DO
FOR j IN [5] DO
FOR k IN [5] DO
FOR m IN [5] DO
FOR n IN [5] DO
test(i, j, k, m, n);
END; END; END; END; END;
PUTF "---- test_count= %d, error_count= %d\n", test_count, err;
ENDP main;