compile("<gxp:loop var='v' type='t' iterable='e' java:iterable='e'/>");
assertNoUnexpectedAlerts();
compile("<gxp:loop var='v' type='t' java:iterable='e' />");
assertAlert(new MissingExpressionError(pos(2, 1), "'iterable' attribute", "JavaScript"));
assertAlert(new MissingExpressionError(pos(2, 1), "'iterable' attribute", "Scala"));
assertNoUnexpectedAlerts();
compile("<gxp:loop var='v' type='t' js:iterable='e' />");
assertAlert(new MissingExpressionError(pos(2,1), "'iterable' attribute", "Java"));
assertAlert(new MissingExpressionError(pos(2,1), "'iterable' attribute", "Scala"));
assertNoUnexpectedAlerts();
// iterator tests
compile("<gxp:loop var='v' type='t' iterator='e' />");
assertAlert(new LoopRequiresIterableInJavaScriptError(pos(2, 1), "<gxp:loop>"));
assertNoUnexpectedAlerts();
compile("<gxp:loop var='v' type='t' expr:iterator='e' />");
assertAlert(new LoopRequiresIterableInJavaScriptError(pos(2, 1), "<gxp:loop>"));
assertNoUnexpectedAlerts();
compile("<gxp:loop var='v' type='t' iterator='e' java:iterator='e' />");
assertAlert(new LoopRequiresIterableInJavaScriptError(pos(2, 1), "<gxp:loop>"));
assertNoUnexpectedAlerts();
compile("<gxp:loop var='v' type='t' cpp:iterator='e' />");
assertAlert(new MissingExpressionError(pos(2, 1), "'iterator' attribute", "Java"));
assertAlert(new MissingExpressionError(pos(2, 1), "'iterator' attribute", "Scala"));
assertAlert(new LoopRequiresIterableInJavaScriptError(pos(2, 1), "<gxp:loop>"));
assertNoUnexpectedAlerts();
compile("<gxp:loop var='v' type='t' js:iterator='e' />");
assertAlert(new UnknownAttributeError("<gxp:loop>", pos(2, 1), "'js:iterator' attribute"));