{ UnitDemo - Demonstrates using multiple separately compiled Pascal units }
program UnitDemo;
uses io, MathLib, StringUtils;
var
a, b, result: integer;
i: integer;
begin
StringUtils.PrintBanner(' MXVM Unit Demo ', 20);
writeln;
i := TestReturn;
writeln('Test return', i);
{ Basic arithmetic }
StringUtils.PrintHeader('Arithmetic');
a := 42;
b := 17;
StringUtils.PrintLabeledInt('a', a);
StringUtils.PrintLabeledInt('b', b);
StringUtils.PrintLabeledInt('Add(a, b)', MathLib.Add(a, b));
StringUtils.PrintLabeledInt('Subtract(a, b)', MathLib.Subtract(a, b));
StringUtils.PrintLabeledInt('Multiply(a, b)', MathLib.Multiply(a, b));
StringUtils.PrintLabeledInt('Divide(a, b)', MathLib.Divide(a, b));
StringUtils.PrintSeparator;
writeln;
{ Power and factorial }
StringUtils.PrintHeader('Power & Factorial');
StringUtils.PrintLabeledInt('2^10', MathLib.Power(2, 10));
StringUtils.PrintLabeledInt('3^5', MathLib.Power(3, 5));
for i := 1 to 10 do
StringUtils.PrintLabeledInt('Factorial', MathLib.Factorial(i));
StringUtils.PrintSeparator;
writeln;
{ Min, Max, Abs }
StringUtils.PrintHeader('Min / Max / Abs');
StringUtils.PrintLabeledInt('Max(100, 200)', MathLib.Max(100, 200));
StringUtils.PrintLabeledInt('Min(100, 200)', MathLib.Min(100, 200));
StringUtils.PrintLabeledInt('Abs(-55)', MathLib.Abs(-55));
StringUtils.PrintLabeledInt('Abs(55)', MathLib.Abs(55));
StringUtils.PrintSeparator;
writeln;
{ Division by zero safety }
StringUtils.PrintHeader('Edge Cases');
StringUtils.PrintLabeledInt('Divide(10, 0)', MathLib.Divide(10, 0));
StringUtils.PrintLabeledInt('Factorial(0)', MathLib.Factorial(0));
StringUtils.PrintLabeledInt('Power(5, 0)', MathLib.Power(5, 0));
StringUtils.PrintSeparator;
writeln;
StringUtils.PrintBanner(' Demo Complete ', 20);
end.