Deine Prozedur Test möchte eine veränderbare Variable ("call by Reference").
Wenn du ihr "i + 1" gibst, wie soll man ein "i + 1" verändern können? Ein "i" an sich kann man verändern. Damit ist sie ja auch zufrieden wie du siehst. Das Casten nach Integer bringt auch nichts, denn das Ergebnis dieses Casts ist ja ein neuer Integer. Und der ist vollkommen anonym. Selbst wenn dir deine Test-Prozedur damit etwas anstellen würde, kämst du an dieses Ergebnis nie wieder dran.
Die letzten beiden Zeilen machen es richtig: Erst i erhöhen, dann übergeben.
Und fröhlichen Stack Overflow noch