/Tests/Translation/Extractor/File/FormExtractorTest.php

https://github.com/schmittjoh/JMSTranslationBundle · PHP · 268 lines · 179 code · 50 blank · 39 comment · 0 complexity · 73535822460262c04806762d0945466c MD5 · raw file

  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * Copyright 2011 Johannes M. Schmitt <schmittjoh@gmail.com>
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. namespace JMS\TranslationBundle\Tests\Translation\Extractor\File;
  19. use JMS\TranslationBundle\Model\Message;
  20. use JMS\TranslationBundle\Model\MessageCatalogue;
  21. use JMS\TranslationBundle\Translation\Extractor\File\FormExtractor;
  22. class FormExtractorTest extends BasePhpFileExtractorTest
  23. {
  24. /**
  25. * @group placeholder
  26. */
  27. public function testPlaceholderExtract()
  28. {
  29. $expected = new MessageCatalogue();
  30. $fileSourceFactory = $this->getFileSourceFactory();
  31. $fixtureSplInfo = new \SplFileInfo(__DIR__ . '/Fixture/MyPlaceholderFormType.php');
  32. $message = new Message('field.with.placeholder');
  33. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 32));
  34. $expected->add($message);
  35. $message = new Message('form.placeholder.text');
  36. $message->setDesc('Field with a placeholder value');
  37. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 33));
  38. $expected->add($message);
  39. $message = new Message('form.placeholder.text.but.no.label');
  40. $message->setDesc('Field with a placeholder but no label');
  41. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 37));
  42. $expected->add($message);
  43. $message = new Message('form.choice_placeholder');
  44. $message->setDesc('Choice field with a placeholder');
  45. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 39));
  46. $expected->add($message);
  47. $message = new Message('form.choice_empty_value');
  48. $message->setDesc('Choice field with an empty_value');
  49. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 40));
  50. $expected->add($message);
  51. $this->assertEquals($expected, $this->extract('MyPlaceholderFormType.php'));
  52. }
  53. /**
  54. * @group testExtract
  55. */
  56. public function testExtract()
  57. {
  58. $expected = new MessageCatalogue();
  59. $fileSourceFactory = $this->getFileSourceFactory();
  60. $fixtureSplInfo = new \SplFileInfo(__DIR__ . '/Fixture/MyFormType.php');
  61. $message = new Message('foo');
  62. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 35));
  63. $expected->add($message);
  64. $message = new Message('form.states.empty_value');
  65. $message->setDesc('Please select a state');
  66. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 36));
  67. $expected->add($message);
  68. $message = new Message('form.label.lastname');
  69. $message->setDesc('Lastname');
  70. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 33));
  71. $expected->add($message);
  72. $message = new Message('form.label.firstname');
  73. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 32));
  74. $expected->add($message);
  75. $message = new Message('form.label.password');
  76. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 40));
  77. $expected->add($message);
  78. $message = new Message('form.label.password_repeated');
  79. $message->setDesc('Repeat password');
  80. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 41));
  81. $expected->add($message);
  82. $message = new Message('form.label.street', 'address');
  83. $message->setDesc('Street');
  84. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 45));
  85. $expected->add($message);
  86. $message = new Message('form.street.empty_value', 'validators');
  87. $message->setDesc('You should fill in the street');
  88. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 48));
  89. $expected->add($message);
  90. $message = new Message('form.label.zip', 'address');
  91. $message->setDesc('ZIP');
  92. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 54));
  93. $expected->add($message);
  94. $message = new Message('form.error.password_mismatch', 'validators');
  95. $message->setDesc('The entered passwords do not match');
  96. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 42));
  97. $expected->add($message);
  98. $message = new Message('form.label.created');
  99. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 65));
  100. $expected->add($message);
  101. $message = new Message('field.with.placeholder');
  102. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 58));
  103. $expected->add($message);
  104. $message = new Message('form.placeholder.text');
  105. $message->setDesc('Field with a placeholder value');
  106. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 59));
  107. $expected->add($message);
  108. $message = new Message('form.placeholder.text.but.no.label');
  109. $message->setDesc('Field with a placeholder but no label');
  110. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 63));
  111. $expected->add($message);
  112. $message = new Message('form.dueDate.empty.year');
  113. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 67));
  114. $expected->add($message);
  115. $message = new Message('form.dueDate.empty.month');
  116. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 67));
  117. $expected->add($message);
  118. $message = new Message('form.dueDate.empty.day');
  119. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 67));
  120. $expected->add($message);
  121. $this->assertEquals($expected, $this->extract('MyFormType.php'));
  122. }
  123. protected function getDefaultDomainFixture($fixtureFile)
  124. {
  125. $expected = new MessageCatalogue();
  126. $fileSourceFactory = $this->getFileSourceFactory();
  127. $fixtureSplInfo = new \SplFileInfo($fixtureFile);
  128. $message = new Message('form.label.lastname', 'person');
  129. $message->setDesc('Lastname');
  130. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 33));
  131. $expected->add($message);
  132. $message = new Message('form.label.firstname', 'person');
  133. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 32));
  134. $expected->add($message);
  135. $message = new Message('form.label.street', 'address');
  136. $message->setDesc('Street');
  137. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 35));
  138. $expected->add($message);
  139. return $expected;
  140. }
  141. /**
  142. * This test is used to check if the default 'translation_domain' option
  143. * set for the entire form is extracted correctly
  144. */
  145. public function testExtractWithDefaultDomain()
  146. {
  147. $this->assertEquals($this->getDefaultDomainFixture(__DIR__ . '/Fixture/MyFormTypeWithDefaultDomain.php'), $this->extract('MyFormTypeWithDefaultDomain.php'));
  148. }
  149. /**
  150. * This test is used to check if the default 'translation_domain' option
  151. * set for the entire form is extracted correctly when set via setDefault
  152. */
  153. public function testExtractWithDefaultDomainSetDefault()
  154. {
  155. $this->assertEquals($this->getDefaultDomainFixture(__DIR__ . '/Fixture/MyFormTypeWithDefaultDomainSetDefault.php'), $this->extract('MyFormTypeWithDefaultDomainSetDefault.php'));
  156. }
  157. /**
  158. * This test is used to check if translation from subscriber classes and even closures
  159. * are correctly extracted
  160. */
  161. public function testExtractWithSubscriberAndListener()
  162. {
  163. $expected = new MessageCatalogue();
  164. $fileSourceFactory = $this->getFileSourceFactory();
  165. $fixtureSplInfo = new \SplFileInfo(__DIR__ . '/Fixture/MyFormTypeWithSubscriberAndListener.php');
  166. $subscriberFixtureSplInfo = new \SplFileInfo(__DIR__ . '/Fixture/MyFormSubscriber.php');
  167. $message = new Message('form.label.lastname');
  168. $message->setDesc('Lastname');
  169. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 35));
  170. $expected->add($message);
  171. $message = new Message('form.label.firstname');
  172. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 34));
  173. $expected->add($message);
  174. $message = new Message('form.label.password');
  175. $message->addSource($fileSourceFactory->create($subscriberFixtureSplInfo, 39));
  176. $expected->add($message);
  177. $message = new Message('form.label.password_repeated');
  178. $message->setDesc('Repeat password');
  179. $message->addSource($fileSourceFactory->create($subscriberFixtureSplInfo, 40));
  180. $expected->add($message);
  181. $message = new Message('form.label.zip', 'address');
  182. $message->setDesc('ZIP');
  183. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 49));
  184. $expected->add($message);
  185. $message = new Message('form.error.password_mismatch', 'validators');
  186. $message->setDesc('The entered passwords do not match');
  187. $message->addSource($fileSourceFactory->create($subscriberFixtureSplInfo, 41));
  188. $expected->add($message);
  189. $catalogue = $this->extract('MyFormTypeWithSubscriberAndListener.php');
  190. //Merge with the subscriber catalogue
  191. $catalogue->merge($this->extract('MyFormSubscriber.php'));
  192. $this->assertEquals($expected, $catalogue);
  193. }
  194. /**
  195. * Run extractor tests with and without a default domain as a form option
  196. * with the same extractor instance to see that the default domain isn't
  197. * persisting.
  198. */
  199. public function testExtractWithNoDefaultDomainAfterDefaultDomainExtraction()
  200. {
  201. $this->testExtractWithDefaultDomain();
  202. $this->testExtract();
  203. }
  204. public function testAttrArrayForm()
  205. {
  206. $expected = new MessageCatalogue();
  207. $fileSourceFactory = $this->getFileSourceFactory();
  208. $fixtureSplInfo = new \SplFileInfo(__DIR__ . '/Fixture/MyAttrArrayType.php');
  209. $message = new Message('form.label.firstname');
  210. $message->addSource($fileSourceFactory->create($fixtureSplInfo, 33));
  211. $expected->add($message);
  212. $this->assertEquals($expected, $this->extract('MyAttrArrayType.php'));
  213. }
  214. protected function getDefaultExtractor()
  215. {
  216. return new FormExtractor($this->getDocParser(), $this->getFileSourceFactory());
  217. }
  218. }