/interpreter/tags/at_build150307/test/edu/vub/at/objects/mirrors/MirrorsOnNativesTest.java

http://ambienttalk.googlecode.com/ · Java · 81 lines · 64 code · 11 blank · 6 comment · 0 complexity · b377f9abda5e80f5426bfdcb023d9922 MD5 · raw file

  1. package edu.vub.at.objects.mirrors;
  2. import edu.vub.at.AmbientTalkTest;
  3. import edu.vub.at.exceptions.InterpreterException;
  4. import edu.vub.at.exceptions.XIllegalOperation;
  5. import edu.vub.at.exceptions.XSelectorNotFound;
  6. import edu.vub.at.objects.ATClosure;
  7. import edu.vub.at.objects.ATMethod;
  8. import edu.vub.at.objects.ATObject;
  9. import edu.vub.at.objects.natives.NATNumber;
  10. import edu.vub.at.objects.natives.NATTable;
  11. import edu.vub.at.objects.natives.grammar.AGSymbol;
  12. /**
  13. * This class tests introspective mirror facilities on native objects.
  14. *
  15. * @author tvcutsem
  16. */
  17. public class MirrorsOnNativesTest extends AmbientTalkTest {
  18. public static void main(String[] args) {
  19. junit.swingui.TestRunner.run(MirrorsOnNativesTest.class);
  20. }
  21. public void setUp() {
  22. evalAndReturn("def mirrorOn1 := (reflect: 1)");
  23. }
  24. public void testInvocation() {
  25. evalAndCompareTo("mirrorOn1.invoke(mirrorOn1.base, `+, [2])", "3");
  26. evalAndTestException("mirrorOn1.invoke(mirrorOn1.base, `foo, [2])", XSelectorNotFound.class);
  27. }
  28. public void testRespondsTo() {
  29. evalAndCompareTo("mirrorOn1.respondsTo(`+)", "true");
  30. evalAndCompareTo("mirrorOn1.respondsTo(`foo)", "false");
  31. evalAndCompareTo("(reflect: mirrorOn1).respondsTo(`invoke)", "true");
  32. }
  33. public void testSelection() {
  34. try {
  35. ATObject clo = evalAndReturn("mirrorOn1.select(mirrorOn1.base, `+)");
  36. assertTrue(clo.isClosure());
  37. ATClosure c = clo.asClosure();
  38. ATMethod m = c.base_getMethod();
  39. assertEquals(NativeMethod.class, m.getClass());
  40. assertEquals(AGSymbol.jAlloc("+"), m.base_getName());
  41. assertEquals(NATNumber.atValue(2), c.base_apply(NATTable.atValue(new ATObject[] { NATNumber.ONE })));
  42. } catch (InterpreterException e) {
  43. fail(e.getMessage());
  44. }
  45. }
  46. public void testAddition() {
  47. evalAndTestException("mirrorOn1.addField(object: { nil })", XIllegalOperation.class);
  48. evalAndTestException("mirrorOn1.addMethod(mirrorOn1.grabMethod(`+))", XIllegalOperation.class);
  49. }
  50. public void testAcquisition() {
  51. try {
  52. ATMethod nativeMethod = evalAndReturn("mirrorOn1.grabMethod(`+)").asMethod();
  53. assertEquals(NativeMethod.class, nativeMethod.getClass());
  54. assertEquals(AGSymbol.jAlloc("+"), nativeMethod.base_getName());
  55. } catch (InterpreterException e) {
  56. fail(e.getMessage());
  57. }
  58. }
  59. public void testListing() {
  60. try {
  61. evalAndReturn("mirrorOn1.listMethods()").asTable();
  62. evalAndCompareTo("mirrorOn1.listFields()", "[<native field:super of 1>]");
  63. // when mirroring a mirror and querying its fields, the field 'base' should always be present
  64. evalAndCompareTo("{ |exit| (reflect: mirrorOn1).listFields().each: { |field|" +
  65. " if: (field.name == `base) then: { exit(`foundit) } } }.escape()", "foundit");
  66. } catch (InterpreterException e) {
  67. fail(e.getMessage());
  68. }
  69. }
  70. }