/org.eclipse.xtext.tests/src/org/eclipse/xtext/valueconverter/Bug250313Test.java

https://github.com/eclipse/xtext-core · Java · 392 lines · 329 code · 51 blank · 12 comment · 0 complexity · 9af8aa509ca7877110979ad385d8121c MD5 · raw file

  1. /*******************************************************************************
  2. * Copyright (c) 2008, 2016 itemis AG (http://www.itemis.eu) and others.
  3. * This program and the accompanying materials are made available under the
  4. * terms of the Eclipse Public License 2.0 which is available at
  5. * http://www.eclipse.org/legal/epl-2.0.
  6. *
  7. * SPDX-License-Identifier: EPL-2.0
  8. *******************************************************************************/
  9. package org.eclipse.xtext.valueconverter;
  10. import java.io.InputStream;
  11. import org.eclipse.emf.common.util.URI;
  12. import org.eclipse.xtext.conversion.IValueConverterService;
  13. import org.eclipse.xtext.conversion.ValueConverterException;
  14. import org.eclipse.xtext.nodemodel.ICompositeNode;
  15. import org.eclipse.xtext.nodemodel.ILeafNode;
  16. import org.eclipse.xtext.nodemodel.INode;
  17. import org.eclipse.xtext.parser.ParserTestHelper;
  18. import org.eclipse.xtext.resource.XtextResource;
  19. import org.eclipse.xtext.tests.AbstractXtextTests;
  20. import org.eclipse.xtext.valueconverter.Bug250313RuntimeModule.Converters;
  21. import org.eclipse.xtext.valueconverter.bug250313.Model;
  22. import org.junit.Test;
  23. import com.google.common.collect.Iterables;
  24. import com.google.inject.Binder;
  25. import com.google.inject.Guice;
  26. import com.google.inject.Inject;
  27. import com.google.inject.Injector;
  28. public class Bug250313Test extends AbstractXtextTests {
  29. private ParserTestHelper helper;
  30. private INode node;
  31. private String lexerRule;
  32. private int convertCallCount;
  33. private String string;
  34. @Override
  35. public void setUp() throws Exception {
  36. super.setUp();
  37. with(new Bug250313StandaloneSetup() {
  38. @Override
  39. public Injector createInjector() {
  40. return Guice.createInjector(new MyBug250313RuntimeModule(Bug250313Test.this));
  41. }
  42. });
  43. helper = new ParserTestHelper(getResourceFactory(), getParser(), get(Keys.RESOURCE_SET_KEY),getCurrentFileExtension());
  44. }
  45. @Override
  46. public void tearDown() throws Exception {
  47. string = null;
  48. node = null;
  49. lexerRule = null;
  50. convertCallCount = 0;
  51. super.tearDown();
  52. }
  53. @Override
  54. protected boolean shouldTestSerializer(XtextResource resource) {
  55. return false;
  56. }
  57. public static class MyBug250313RuntimeModule extends Bug250313RuntimeModule {
  58. private final Bug250313Test test;
  59. public MyBug250313RuntimeModule(Bug250313Test test) {
  60. this.test = test;
  61. }
  62. @Override
  63. public void configure(Binder binder) {
  64. super.configure(binder);
  65. binder.bind(Bug250313Test.class).toInstance(test);
  66. }
  67. @Override
  68. public Class<? extends IValueConverterService> bindIValueConverterService() {
  69. return MyConverterService.class;
  70. }
  71. }
  72. public static class MyConverterService implements IValueConverterService {
  73. @Inject
  74. private Converters delegate;
  75. @Inject
  76. private Bug250313Test test;
  77. @Override
  78. public String toString(Object value, String lexerRule) {
  79. return delegate.toString(value, lexerRule);
  80. }
  81. @Override
  82. public Object toValue(String string, String lexerRule, INode node) throws ValueConverterException {
  83. test.toValueCalled(string, lexerRule, node);
  84. return delegate.toValue(string, lexerRule, node);
  85. }
  86. }
  87. public void toValueCalled(String string, String lexerRule, INode node) {
  88. this.string = string;
  89. this.node = node;
  90. this.lexerRule = lexerRule;
  91. this.convertCallCount++;
  92. }
  93. @Override
  94. public XtextResource doGetResource(InputStream in, URI uri) throws Exception {
  95. return helper.getResourceFromStream(in);
  96. }
  97. @Test public void testSTRINGConversion_01() throws Exception {
  98. Model model = (Model) getModel("1 'str'");
  99. assertEquals("str", model.getValue());
  100. assertNotNull(lexerRule);
  101. assertEquals("org.eclipse.xtext.common.Terminals.STRING", lexerRule);
  102. assertTrue(node instanceof ILeafNode);
  103. assertEquals("'str'", string);
  104. assertEquals(1, convertCallCount);
  105. }
  106. @Test public void testSTRINGConversion_02() throws Exception {
  107. Model model = (Model) getModel("'str'");
  108. assertEquals("str", model.getValue());
  109. assertEquals("org.eclipse.xtext.common.Terminals.STRING", lexerRule);
  110. assertTrue(node instanceof ILeafNode);
  111. assertEquals("'str'", string);
  112. assertEquals(1, convertCallCount);
  113. }
  114. @Test public void testSTRINGConversion_03() throws Exception {
  115. Model model = (Model) getModel("2 'str'");
  116. assertEquals("str", model.getValue());
  117. assertEquals("org.eclipse.xtext.common.Terminals.STRING", lexerRule);
  118. assertTrue(node instanceof ILeafNode);
  119. assertEquals("'str'", string);
  120. assertEquals(1, convertCallCount);
  121. }
  122. @Test public void testSTRINGConversion_04() throws Exception {
  123. Model model = (Model) getModel("1+ 'str'");
  124. assertEquals("[str]", model.getMultiValue().toString());
  125. assertNotNull(lexerRule);
  126. assertEquals("org.eclipse.xtext.common.Terminals.STRING", lexerRule);
  127. assertTrue(node instanceof ILeafNode);
  128. assertEquals("'str'", string);
  129. assertEquals(1, convertCallCount);
  130. }
  131. @Test public void testSTRINGConversion_05() throws Exception {
  132. Model model = (Model) getModel("2+ 'str'");
  133. assertEquals("[str]", model.getMultiValue().toString());
  134. assertEquals("org.eclipse.xtext.common.Terminals.STRING", lexerRule);
  135. assertTrue(node instanceof ILeafNode);
  136. assertEquals("'str'", string);
  137. assertEquals(1, convertCallCount);
  138. }
  139. @Test public void testIDConversion_01() throws Exception {
  140. Model model = (Model) getModel("1 str");
  141. assertEquals("str", model.getValue());
  142. assertEquals("org.eclipse.xtext.common.Terminals.ID", lexerRule);
  143. assertTrue(node instanceof ILeafNode);
  144. assertEquals("str", string);
  145. assertEquals(1, convertCallCount);
  146. }
  147. @Test public void testIDConversion_02() throws Exception {
  148. Model model = (Model) getModel("1 ^str");
  149. assertEquals("str", model.getValue());
  150. assertEquals("org.eclipse.xtext.common.Terminals.ID", lexerRule);
  151. assertTrue(node instanceof ILeafNode);
  152. assertEquals("^str", string);
  153. assertEquals(1, convertCallCount);
  154. }
  155. @Test public void testIDConversion_03() throws Exception {
  156. Model model = (Model) getModel("str");
  157. assertEquals("str", model.getValue());
  158. assertEquals("org.eclipse.xtext.common.Terminals.ID", lexerRule);
  159. assertTrue(node instanceof ILeafNode);
  160. assertEquals("str", string);
  161. assertEquals(1, convertCallCount);
  162. }
  163. @Test public void testIDConversion_04() throws Exception {
  164. Model model = (Model) getModel("^str");
  165. assertEquals("str", model.getValue());
  166. assertEquals("org.eclipse.xtext.common.Terminals.ID", lexerRule);
  167. assertTrue(node instanceof ILeafNode);
  168. assertEquals("^str", string);
  169. assertEquals(1, convertCallCount);
  170. }
  171. @Test public void testIDConversion_05() throws Exception {
  172. Model model = (Model) getModel("1+ str");
  173. assertEquals("[str]", model.getMultiValue().toString());
  174. assertEquals("org.eclipse.xtext.common.Terminals.ID", lexerRule);
  175. assertTrue(node instanceof ILeafNode);
  176. assertEquals("str", string);
  177. assertEquals(1, convertCallCount);
  178. }
  179. @Test public void testIDConversion_06() throws Exception {
  180. Model model = (Model) getModel("1+ ^str");
  181. assertEquals("[str]", model.getMultiValue().toString());
  182. assertEquals("org.eclipse.xtext.common.Terminals.ID", lexerRule);
  183. assertTrue(node instanceof ILeafNode);
  184. assertEquals("^str", string);
  185. assertEquals(1, convertCallCount);
  186. }
  187. @Test public void testDatatypeConversion_01() throws Exception {
  188. Model model = (Model) getModel("1 foo - bar");
  189. assertEquals("str", model.getValue());
  190. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.Datatype", lexerRule);
  191. assertTrue(node instanceof ICompositeNode);
  192. assertEquals(6, Iterables.size(((ICompositeNode)node).getChildren()));
  193. assertEquals("foo - bar", string);
  194. assertEquals(1, convertCallCount);
  195. }
  196. @Test public void testDatatypeConversion_02() throws Exception {
  197. Model model = (Model) getModel("foo - bar");
  198. assertEquals("str", model.getValue());
  199. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.Datatype", lexerRule);
  200. assertTrue(node instanceof ICompositeNode);
  201. assertEquals(5, Iterables.size(((ICompositeNode)node).getChildren()));
  202. assertEquals("foo - bar", string);
  203. assertEquals(1, convertCallCount);
  204. }
  205. @Test public void testDatatypeConversion_03() throws Exception {
  206. Model model = (Model) getModel("3 foo - bar");
  207. assertEquals("str", model.getValue());
  208. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.Datatype", lexerRule);
  209. assertTrue(node instanceof ICompositeNode);
  210. assertEquals(6, Iterables.size(((ICompositeNode)node).getChildren()));
  211. assertEquals("foo - bar", string);
  212. assertEquals(1, convertCallCount);
  213. }
  214. @Test public void testDatatypeConversion_04() throws Exception {
  215. Model model = (Model) getModel("1+ foo - bar");
  216. assertEquals("[str]", model.getMultiValue().toString());
  217. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.Datatype", lexerRule);
  218. assertTrue(node instanceof ICompositeNode);
  219. assertEquals(6, Iterables.size(((ICompositeNode)node).getChildren()));
  220. assertEquals("foo - bar", string);
  221. assertEquals(1, convertCallCount);
  222. }
  223. @Test public void testDatatypeConversion_05() throws Exception {
  224. Model model = (Model) getModel("3+ foo - bar");
  225. assertEquals("[str]", model.getMultiValue().toString());
  226. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.Datatype", lexerRule);
  227. assertTrue(node instanceof ICompositeNode);
  228. assertEquals(6, Iterables.size(((ICompositeNode)node).getChildren()));
  229. assertEquals("foo - bar", string);
  230. assertEquals(1, convertCallCount);
  231. }
  232. @Test public void testNestedDatatypeConversion_01() throws Exception {
  233. Model model = (Model) getModel("1 zonk + foo - bar");
  234. assertEquals("str", model.getValue());
  235. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  236. assertTrue(node instanceof ICompositeNode);
  237. assertEquals(5, Iterables.size(((ICompositeNode)node).getChildren()));
  238. assertEquals("zonk + foo - bar", string);
  239. assertEquals(1, convertCallCount);
  240. }
  241. @Test public void testNestedDatatypeConversion_02() throws Exception {
  242. Model model = (Model) getModel("1 zonk +");
  243. assertEquals("str", model.getValue());
  244. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  245. assertTrue(node instanceof ICompositeNode);
  246. assertEquals(4, Iterables.size(((ICompositeNode)node).getChildren()));
  247. assertEquals("zonk +", string);
  248. assertEquals(1, convertCallCount);
  249. }
  250. @Test public void testNestedDatatypeConversion_03() throws Exception {
  251. Model model = (Model) getModel("zonk + foo - bar");
  252. assertEquals("str", model.getValue());
  253. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  254. assertTrue(node instanceof ICompositeNode);
  255. assertEquals(4, Iterables.size(((ICompositeNode)node).getChildren()));
  256. assertEquals("zonk + foo - bar", string);
  257. assertEquals(1, convertCallCount);
  258. }
  259. @Test public void testNestedDatatypeConversion_04() throws Exception {
  260. Model model = (Model) getModel("zonk +");
  261. assertEquals("str", model.getValue());
  262. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  263. assertTrue(node instanceof ICompositeNode);
  264. assertEquals(3, Iterables.size(((ICompositeNode)node).getChildren()));
  265. assertEquals("zonk +", string);
  266. assertEquals(1, convertCallCount);
  267. }
  268. @Test public void testNestedDatatypeConversion_05() throws Exception {
  269. Model model = (Model) getModel("4 zonk + foo - bar");
  270. assertEquals("str", model.getValue());
  271. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  272. assertTrue(node instanceof ICompositeNode);
  273. assertEquals(5, Iterables.size(((ICompositeNode)node).getChildren()));
  274. assertEquals("zonk + foo - bar", string);
  275. assertEquals(1, convertCallCount);
  276. }
  277. @Test public void testNestedDatatypeConversion_06() throws Exception {
  278. Model model = (Model) getModel("4 zonk +");
  279. assertEquals("str", model.getValue());
  280. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  281. assertTrue(node instanceof ICompositeNode);
  282. assertEquals(4, Iterables.size(((ICompositeNode)node).getChildren()));
  283. assertEquals("zonk +", string);
  284. assertEquals(1, convertCallCount);
  285. }
  286. @Test public void testNestedDatatypeConversion_07() throws Exception {
  287. Model model = (Model) getModel("1+ zonk + foo - bar");
  288. assertEquals("[str]", model.getMultiValue().toString());
  289. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  290. assertTrue(node instanceof ICompositeNode);
  291. assertEquals(5, Iterables.size(((ICompositeNode)node).getChildren()));
  292. assertEquals("zonk + foo - bar", string);
  293. assertEquals(1, convertCallCount);
  294. }
  295. @Test public void testNestedDatatypeConversion_08() throws Exception {
  296. Model model = (Model) getModel("1+ zonk +");
  297. assertEquals("[str]", model.getMultiValue().toString());
  298. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  299. assertTrue(node instanceof ICompositeNode);
  300. assertEquals(4, Iterables.size(((ICompositeNode)node).getChildren()));
  301. assertEquals("zonk +", string);
  302. assertEquals(1, convertCallCount);
  303. }
  304. @Test public void testNestedDatatypeConversion_09() throws Exception {
  305. Model model = (Model) getModel("4+ zonk + foo - bar");
  306. assertEquals("[str]", model.getMultiValue().toString());
  307. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  308. assertTrue(node instanceof ICompositeNode);
  309. assertEquals(5, Iterables.size(((ICompositeNode)node).getChildren()));
  310. assertEquals("zonk + foo - bar", string);
  311. assertEquals(1, convertCallCount);
  312. }
  313. @Test public void testNestedDatatypeConversion_10() throws Exception {
  314. Model model = (Model) getModel("4+ zonk +");
  315. assertEquals("[str]", model.getMultiValue().toString());
  316. assertEquals("org.eclipse.xtext.valueconverter.Bug250313.NestedDatatype", lexerRule);
  317. assertTrue(node instanceof ICompositeNode);
  318. assertEquals(4, Iterables.size(((ICompositeNode)node).getChildren()));
  319. assertEquals("zonk +", string);
  320. assertEquals(1, convertCallCount);
  321. }
  322. @Test public void testKeywordConversion_01() throws Exception {
  323. Model model = (Model) getModel("1 mykeyword1");
  324. assertEquals("mykeyword1", model.getValue());
  325. // XXX value converter is not called for keywords?
  326. // if this is a bug, all assertions 'assertEquals(1, convertCallCount)' have to be increased
  327. assertEquals(lexerRule, 0, convertCallCount);
  328. }
  329. @Test public void testKeywordConversion_02() throws Exception {
  330. Model model = (Model) getModel("mykeyword1");
  331. assertEquals("mykeyword1", model.getValue());
  332. assertEquals(lexerRule, 0, convertCallCount);
  333. }
  334. @Test public void testKeywordConversion_03() throws Exception {
  335. Model model = (Model) getModel("1+ mykeyword1");
  336. assertEquals("[mykeyword1]", model.getMultiValue().toString());
  337. // XXX value converter is not called for keywords?
  338. // if this is a bug, all assertions 'assertEquals(1, convertCallCount)' have to be increased
  339. assertEquals(lexerRule, 0, convertCallCount);
  340. }
  341. }