SupportStringableTest.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  1. <?php
  2. namespace Illuminate\Tests\Support;
  3. use Illuminate\Support\Collection;
  4. use Illuminate\Support\HtmlString;
  5. use Illuminate\Support\Stringable;
  6. use PHPUnit\Framework\TestCase;
  7. class SupportStringableTest extends TestCase
  8. {
  9. /**
  10. * @param string $string
  11. * @return \Illuminate\Support\Stringable
  12. */
  13. protected function stringable($string = '')
  14. {
  15. return new Stringable($string);
  16. }
  17. public function testClassBasename()
  18. {
  19. $this->assertEquals(
  20. class_basename(static::class),
  21. $this->stringable(static::class)->classBasename()
  22. );
  23. }
  24. public function testIsAscii()
  25. {
  26. $this->assertTrue($this->stringable('A')->isAscii());
  27. $this->assertFalse($this->stringable('ù')->isAscii());
  28. }
  29. public function testIsUuid()
  30. {
  31. $this->assertTrue($this->stringable('2cdc7039-65a6-4ac7-8e5d-d554a98e7b15')->isUuid());
  32. $this->assertFalse($this->stringable('2cdc7039-65a6-4ac7-8e5d-d554a98')->isUuid());
  33. }
  34. public function testIsEmpty()
  35. {
  36. $this->assertTrue($this->stringable('')->isEmpty());
  37. $this->assertFalse($this->stringable('A')->isEmpty());
  38. $this->assertFalse($this->stringable('0')->isEmpty());
  39. }
  40. public function testPluralStudly()
  41. {
  42. $this->assertSame('LaraCon', (string) $this->stringable('LaraCon')->pluralStudly(1));
  43. $this->assertSame('LaraCons', (string) $this->stringable('LaraCon')->pluralStudly(2));
  44. $this->assertSame('LaraCon', (string) $this->stringable('LaraCon')->pluralStudly(-1));
  45. $this->assertSame('LaraCons', (string) $this->stringable('LaraCon')->pluralStudly(-2));
  46. }
  47. public function testMatch()
  48. {
  49. $stringable = $this->stringable('foo bar');
  50. $this->assertSame('bar', (string) $stringable->match('/bar/'));
  51. $this->assertSame('bar', (string) $stringable->match('/foo (.*)/'));
  52. $this->assertTrue($stringable->match('/nothing/')->isEmpty());
  53. $this->assertEquals(['bar', 'bar'], $this->stringable('bar foo bar')->matchAll('/bar/')->all());
  54. $stringable = $this->stringable('bar fun bar fly');
  55. $this->assertEquals(['un', 'ly'], $stringable->matchAll('/f(\w*)/')->all());
  56. $this->assertTrue($stringable->matchAll('/nothing/')->isEmpty());
  57. }
  58. public function testTest()
  59. {
  60. $stringable = $this->stringable('foo bar');
  61. $this->assertTrue($stringable->test('/bar/'));
  62. $this->assertTrue($stringable->test('/foo (.*)/'));
  63. }
  64. public function testTrim()
  65. {
  66. $this->assertSame('foo', (string) $this->stringable(' foo ')->trim());
  67. }
  68. public function testLtrim()
  69. {
  70. $this->assertSame('foo ', (string) $this->stringable(' foo ')->ltrim());
  71. }
  72. public function testRtrim()
  73. {
  74. $this->assertSame(' foo', (string) $this->stringable(' foo ')->rtrim());
  75. }
  76. public function testCanBeLimitedByWords()
  77. {
  78. $this->assertSame('Taylor...', (string) $this->stringable('Taylor Otwell')->words(1));
  79. $this->assertSame('Taylor___', (string) $this->stringable('Taylor Otwell')->words(1, '___'));
  80. $this->assertSame('Taylor Otwell', (string) $this->stringable('Taylor Otwell')->words(3));
  81. }
  82. public function testUnless()
  83. {
  84. $this->assertSame('unless false', (string) $this->stringable('unless')->unless(false, function ($stringable, $value) {
  85. return $stringable->append(' false');
  86. }));
  87. $this->assertSame('unless true fallbacks to default', (string) $this->stringable('unless')->unless(true, function ($stringable, $value) {
  88. return $stringable->append($value);
  89. }, function ($stringable) {
  90. return $stringable->append(' true fallbacks to default');
  91. }));
  92. }
  93. public function testWhenContains()
  94. {
  95. $this->assertSame('Tony Stark', (string) $this->stringable('stark')->whenContains('tar', function ($stringable) {
  96. return $stringable->prepend('Tony ')->title();
  97. }, function ($stringable) {
  98. return $stringable->prepend('Arno ')->title();
  99. }));
  100. $this->assertSame('stark', (string) $this->stringable('stark')->whenContains('xxx', function ($stringable) {
  101. return $stringable->prepend('Tony ')->title();
  102. }));
  103. $this->assertSame('Arno Stark', (string) $this->stringable('stark')->whenContains('xxx', function ($stringable) {
  104. return $stringable->prepend('Tony ')->title();
  105. }, function ($stringable) {
  106. return $stringable->prepend('Arno ')->title();
  107. }));
  108. }
  109. public function testWhenContainsAll()
  110. {
  111. $this->assertSame('Tony Stark', (string) $this->stringable('tony stark')->whenContainsAll(['tony', 'stark'], function ($stringable) {
  112. return $stringable->title();
  113. }, function ($stringable) {
  114. return $stringable->studly();
  115. }));
  116. $this->assertSame('tony stark', (string) $this->stringable('tony stark')->whenContainsAll(['xxx'], function ($stringable) {
  117. return $stringable->title();
  118. }));
  119. $this->assertSame('TonyStark', (string) $this->stringable('tony stark')->whenContainsAll(['tony', 'xxx'], function ($stringable) {
  120. return $stringable->title();
  121. }, function ($stringable) {
  122. return $stringable->studly();
  123. }));
  124. }
  125. public function testWhenEndsWith()
  126. {
  127. $this->assertSame('Tony Stark', (string) $this->stringable('tony stark')->whenEndsWith('ark', function ($stringable) {
  128. return $stringable->title();
  129. }, function ($stringable) {
  130. return $stringable->studly();
  131. }));
  132. $this->assertSame('Tony Stark', (string) $this->stringable('tony stark')->whenEndsWith(['kra', 'ark'], function ($stringable) {
  133. return $stringable->title();
  134. }, function ($stringable) {
  135. return $stringable->studly();
  136. }));
  137. $this->assertSame('tony stark', (string) $this->stringable('tony stark')->whenEndsWith(['xxx'], function ($stringable) {
  138. return $stringable->title();
  139. }));
  140. $this->assertSame('TonyStark', (string) $this->stringable('tony stark')->whenEndsWith(['tony', 'xxx'], function ($stringable) {
  141. return $stringable->title();
  142. }, function ($stringable) {
  143. return $stringable->studly();
  144. }));
  145. }
  146. public function testWhenExactly()
  147. {
  148. $this->assertSame('Nailed it...!', (string) $this->stringable('Tony Stark')->whenExactly('Tony Stark', function ($stringable) {
  149. return 'Nailed it...!';
  150. }, function ($stringable) {
  151. return 'Swing and a miss...!';
  152. }));
  153. $this->assertSame('Swing and a miss...!', (string) $this->stringable('Tony Stark')->whenExactly('Iron Man', function ($stringable) {
  154. return 'Nailed it...!';
  155. }, function ($stringable) {
  156. return 'Swing and a miss...!';
  157. }));
  158. $this->assertSame('Tony Stark', (string) $this->stringable('Tony Stark')->whenExactly('Iron Man', function ($stringable) {
  159. return 'Nailed it...!';
  160. }));
  161. }
  162. public function testWhenIs()
  163. {
  164. $this->assertSame('Winner: /', (string) $this->stringable('/')->whenIs('/', function ($stringable) {
  165. return $stringable->prepend('Winner: ');
  166. }, function ($stringable) {
  167. return 'Try again';
  168. }));
  169. $this->assertSame('/', (string) $this->stringable('/')->whenIs(' /', function ($stringable) {
  170. return $stringable->prepend('Winner: ');
  171. }));
  172. $this->assertSame('Try again', (string) $this->stringable('/')->whenIs(' /', function ($stringable) {
  173. return $stringable->prepend('Winner: ');
  174. }, function ($stringable) {
  175. return 'Try again';
  176. }));
  177. $this->assertSame('Winner: foo/bar/baz', (string) $this->stringable('foo/bar/baz')->whenIs('foo/*', function ($stringable) {
  178. return $stringable->prepend('Winner: ');
  179. }));
  180. }
  181. public function testWhenIsAscii()
  182. {
  183. $this->assertSame('Ascii: A', (string) $this->stringable('A')->whenIsAscii(function ($stringable) {
  184. return $stringable->prepend('Ascii: ');
  185. }, function ($stringable) {
  186. return $stringable->prepend('Not Ascii: ');
  187. }));
  188. $this->assertSame('ù', (string) $this->stringable('ù')->whenIsAscii(function ($stringable) {
  189. return $stringable->prepend('Ascii: ');
  190. }));
  191. $this->assertSame('Not Ascii: ù', (string) $this->stringable('ù')->whenIsAscii(function ($stringable) {
  192. return $stringable->prepend('Ascii: ');
  193. }, function ($stringable) {
  194. return $stringable->prepend('Not Ascii: ');
  195. }));
  196. }
  197. public function testWhenIsUuid()
  198. {
  199. $this->assertSame('Uuid: 2cdc7039-65a6-4ac7-8e5d-d554a98e7b15', (string) $this->stringable('2cdc7039-65a6-4ac7-8e5d-d554a98e7b15')->whenIsUuid(function ($stringable) {
  200. return $stringable->prepend('Uuid: ');
  201. }, function ($stringable) {
  202. return $stringable->prepend('Not Uuid: ');
  203. }));
  204. $this->assertSame('2cdc7039-65a6-4ac7-8e5d-d554a98', (string) $this->stringable('2cdc7039-65a6-4ac7-8e5d-d554a98')->whenIsUuid(function ($stringable) {
  205. return $stringable->prepend('Uuid: ');
  206. }));
  207. $this->assertSame('Not Uuid: 2cdc7039-65a6-4ac7-8e5d-d554a98', (string) $this->stringable('2cdc7039-65a6-4ac7-8e5d-d554a98')->whenIsUuid(function ($stringable) {
  208. return $stringable->prepend('Uuid: ');
  209. }, function ($stringable) {
  210. return $stringable->prepend('Not Uuid: ');
  211. }));
  212. }
  213. public function testWhenTest()
  214. {
  215. $this->assertSame('Winner: foo bar', (string) $this->stringable('foo bar')->whenTest('/bar/', function ($stringable) {
  216. return $stringable->prepend('Winner: ');
  217. }, function ($stringable) {
  218. return 'Try again';
  219. }));
  220. $this->assertSame('Try again', (string) $this->stringable('foo bar')->whenTest('/link/', function ($stringable) {
  221. return $stringable->prepend('Winner: ');
  222. }, function ($stringable) {
  223. return 'Try again';
  224. }));
  225. $this->assertSame('foo bar', (string) $this->stringable('foo bar')->whenTest('/link/', function ($stringable) {
  226. return $stringable->prepend('Winner: ');
  227. }));
  228. }
  229. public function testWhenStartsWith()
  230. {
  231. $this->assertSame('Tony Stark', (string) $this->stringable('tony stark')->whenStartsWith('ton', function ($stringable) {
  232. return $stringable->title();
  233. }, function ($stringable) {
  234. return $stringable->studly();
  235. }));
  236. $this->assertSame('Tony Stark', (string) $this->stringable('tony stark')->whenStartsWith(['ton', 'not'], function ($stringable) {
  237. return $stringable->title();
  238. }, function ($stringable) {
  239. return $stringable->studly();
  240. }));
  241. $this->assertSame('tony stark', (string) $this->stringable('tony stark')->whenStartsWith(['xxx'], function ($stringable) {
  242. return $stringable->title();
  243. }));
  244. $this->assertSame('Tony Stark', (string) $this->stringable('tony stark')->whenStartsWith(['tony', 'xxx'], function ($stringable) {
  245. return $stringable->title();
  246. }, function ($stringable) {
  247. return $stringable->studly();
  248. }));
  249. }
  250. public function testWhenEmpty()
  251. {
  252. tap($this->stringable(), function ($stringable) {
  253. $this->assertSame($stringable, $stringable->whenEmpty(function () {
  254. //
  255. }));
  256. });
  257. $this->assertSame('empty', (string) $this->stringable()->whenEmpty(function () {
  258. return 'empty';
  259. }));
  260. $this->assertSame('not-empty', (string) $this->stringable('not-empty')->whenEmpty(function () {
  261. return 'empty';
  262. }));
  263. }
  264. public function testWhenNotEmpty()
  265. {
  266. tap($this->stringable(), function ($stringable) {
  267. $this->assertSame($stringable, $stringable->whenNotEmpty(function ($stringable) {
  268. return $stringable.'.';
  269. }));
  270. });
  271. $this->assertSame('', (string) $this->stringable()->whenNotEmpty(function ($stringable) {
  272. return $stringable.'.';
  273. }));
  274. $this->assertSame('Not empty.', (string) $this->stringable('Not empty')->whenNotEmpty(function ($stringable) {
  275. return $stringable.'.';
  276. }));
  277. }
  278. public function testWhenFalse()
  279. {
  280. $this->assertSame('when', (string) $this->stringable('when')->when(false, function ($stringable, $value) {
  281. return $stringable->append($value)->append('false');
  282. }));
  283. $this->assertSame('when false fallbacks to default', (string) $this->stringable('when false ')->when(false, function ($stringable, $value) {
  284. return $stringable->append($value);
  285. }, function ($stringable) {
  286. return $stringable->append('fallbacks to default');
  287. }));
  288. }
  289. public function testWhenTrue()
  290. {
  291. $this->assertSame('when true', (string) $this->stringable('when ')->when(true, function ($stringable) {
  292. return $stringable->append('true');
  293. }));
  294. $this->assertSame('gets a value from if', (string) $this->stringable('gets a value ')->when('from if', function ($stringable, $value) {
  295. return $stringable->append($value);
  296. }, function ($stringable) {
  297. return $stringable->append('fallbacks to default');
  298. }));
  299. }
  300. public function testUnlessTruthy()
  301. {
  302. $this->assertSame('unless', (string) $this->stringable('unless')->unless(1, function ($stringable, $value) {
  303. return $stringable->append($value)->append('true');
  304. }));
  305. $this->assertSame('unless true fallbacks to default with value 1',
  306. (string) $this->stringable('unless true ')->unless(1, function ($stringable, $value) {
  307. return $stringable->append($value);
  308. }, function ($stringable, $value) {
  309. return $stringable->append('fallbacks to default with value ')->append($value);
  310. }));
  311. }
  312. public function testUnlessFalsy()
  313. {
  314. $this->assertSame('unless 0', (string) $this->stringable('unless ')->unless(0, function ($stringable, $value) {
  315. return $stringable->append($value);
  316. }));
  317. $this->assertSame('gets the value 0',
  318. (string) $this->stringable('gets the value ')->unless(0, function ($stringable, $value) {
  319. return $stringable->append($value);
  320. }, function ($stringable) {
  321. return $stringable->append('fallbacks to default');
  322. }));
  323. }
  324. public function testTrimmedOnlyWhereNecessary()
  325. {
  326. $this->assertSame(' Taylor Otwell ', (string) $this->stringable(' Taylor Otwell ')->words(3));
  327. $this->assertSame(' Taylor...', (string) $this->stringable(' Taylor Otwell ')->words(1));
  328. }
  329. public function testTitle()
  330. {
  331. $this->assertSame('Jefferson Costella', (string) $this->stringable('jefferson costella')->title());
  332. $this->assertSame('Jefferson Costella', (string) $this->stringable('jefFErson coSTella')->title());
  333. }
  334. public function testWithoutWordsDoesntProduceError()
  335. {
  336. $nbsp = chr(0xC2).chr(0xA0);
  337. $this->assertSame(' ', (string) $this->stringable(' ')->words());
  338. $this->assertEquals($nbsp, (string) $this->stringable($nbsp)->words());
  339. }
  340. public function testAscii()
  341. {
  342. $this->assertSame('@', (string) $this->stringable('@')->ascii());
  343. $this->assertSame('u', (string) $this->stringable('ü')->ascii());
  344. }
  345. public function testAsciiWithSpecificLocale()
  346. {
  347. $this->assertSame('h H sht Sht a A ia yo', (string) $this->stringable('х Х щ Щ ъ Ъ иа йо')->ascii('bg'));
  348. $this->assertSame('ae oe ue Ae Oe Ue', (string) $this->stringable('ä ö ü Ä Ö Ü')->ascii('de'));
  349. }
  350. public function testStartsWith()
  351. {
  352. $this->assertTrue($this->stringable('jason')->startsWith('jas'));
  353. $this->assertTrue($this->stringable('jason')->startsWith('jason'));
  354. $this->assertTrue($this->stringable('jason')->startsWith(['jas']));
  355. $this->assertTrue($this->stringable('jason')->startsWith(['day', 'jas']));
  356. $this->assertFalse($this->stringable('jason')->startsWith('day'));
  357. $this->assertFalse($this->stringable('jason')->startsWith(['day']));
  358. $this->assertFalse($this->stringable('jason')->startsWith(null));
  359. $this->assertFalse($this->stringable('jason')->startsWith([null]));
  360. $this->assertFalse($this->stringable('0123')->startsWith([null]));
  361. $this->assertTrue($this->stringable('0123')->startsWith(0));
  362. $this->assertFalse($this->stringable('jason')->startsWith('J'));
  363. $this->assertFalse($this->stringable('jason')->startsWith(''));
  364. $this->assertFalse($this->stringable('7')->startsWith(' 7'));
  365. $this->assertTrue($this->stringable('7a')->startsWith('7'));
  366. $this->assertTrue($this->stringable('7a')->startsWith(7));
  367. $this->assertTrue($this->stringable('7.12a')->startsWith(7.12));
  368. $this->assertFalse($this->stringable('7.12a')->startsWith(7.13));
  369. $this->assertTrue($this->stringable(7.123)->startsWith('7'));
  370. $this->assertTrue($this->stringable(7.123)->startsWith('7.12'));
  371. $this->assertFalse($this->stringable(7.123)->startsWith('7.13'));
  372. // Test for multibyte string support
  373. $this->assertTrue($this->stringable('Jönköping')->startsWith('Jö'));
  374. $this->assertTrue($this->stringable('Malmö')->startsWith('Malmö'));
  375. $this->assertFalse($this->stringable('Jönköping')->startsWith('Jonko'));
  376. $this->assertFalse($this->stringable('Malmö')->startsWith('Malmo'));
  377. }
  378. public function testEndsWith()
  379. {
  380. $this->assertTrue($this->stringable('jason')->endsWith('on'));
  381. $this->assertTrue($this->stringable('jason')->endsWith('jason'));
  382. $this->assertTrue($this->stringable('jason')->endsWith(['on']));
  383. $this->assertTrue($this->stringable('jason')->endsWith(['no', 'on']));
  384. $this->assertFalse($this->stringable('jason')->endsWith('no'));
  385. $this->assertFalse($this->stringable('jason')->endsWith(['no']));
  386. $this->assertFalse($this->stringable('jason')->endsWith(''));
  387. $this->assertFalse($this->stringable('jason')->endsWith([null]));
  388. $this->assertFalse($this->stringable('jason')->endsWith(null));
  389. $this->assertFalse($this->stringable('jason')->endsWith('N'));
  390. $this->assertFalse($this->stringable('7')->endsWith(' 7'));
  391. $this->assertTrue($this->stringable('a7')->endsWith('7'));
  392. $this->assertTrue($this->stringable('a7')->endsWith(7));
  393. $this->assertTrue($this->stringable('a7.12')->endsWith(7.12));
  394. $this->assertFalse($this->stringable('a7.12')->endsWith(7.13));
  395. $this->assertTrue($this->stringable(0.27)->endsWith('7'));
  396. $this->assertTrue($this->stringable(0.27)->endsWith('0.27'));
  397. $this->assertFalse($this->stringable(0.27)->endsWith('8'));
  398. // Test for multibyte string support
  399. $this->assertTrue($this->stringable('Jönköping')->endsWith('öping'));
  400. $this->assertTrue($this->stringable('Malmö')->endsWith('mö'));
  401. $this->assertFalse($this->stringable('Jönköping')->endsWith('oping'));
  402. $this->assertFalse($this->stringable('Malmö')->endsWith('mo'));
  403. }
  404. public function testBefore()
  405. {
  406. $this->assertSame('han', (string) $this->stringable('hannah')->before('nah'));
  407. $this->assertSame('ha', (string) $this->stringable('hannah')->before('n'));
  408. $this->assertSame('ééé ', (string) $this->stringable('ééé hannah')->before('han'));
  409. $this->assertSame('hannah', (string) $this->stringable('hannah')->before('xxxx'));
  410. $this->assertSame('hannah', (string) $this->stringable('hannah')->before(''));
  411. $this->assertSame('han', (string) $this->stringable('han0nah')->before('0'));
  412. $this->assertSame('han', (string) $this->stringable('han0nah')->before(0));
  413. $this->assertSame('han', (string) $this->stringable('han2nah')->before(2));
  414. }
  415. public function testBeforeLast()
  416. {
  417. $this->assertSame('yve', (string) $this->stringable('yvette')->beforeLast('tte'));
  418. $this->assertSame('yvet', (string) $this->stringable('yvette')->beforeLast('t'));
  419. $this->assertSame('ééé ', (string) $this->stringable('ééé yvette')->beforeLast('yve'));
  420. $this->assertSame('', (string) $this->stringable('yvette')->beforeLast('yve'));
  421. $this->assertSame('yvette', (string) $this->stringable('yvette')->beforeLast('xxxx'));
  422. $this->assertSame('yvette', (string) $this->stringable('yvette')->beforeLast(''));
  423. $this->assertSame('yv0et', (string) $this->stringable('yv0et0te')->beforeLast('0'));
  424. $this->assertSame('yv0et', (string) $this->stringable('yv0et0te')->beforeLast(0));
  425. $this->assertSame('yv2et', (string) $this->stringable('yv2et2te')->beforeLast(2));
  426. }
  427. public function testBetween()
  428. {
  429. $this->assertSame('abc', (string) $this->stringable('abc')->between('', 'c'));
  430. $this->assertSame('abc', (string) $this->stringable('abc')->between('a', ''));
  431. $this->assertSame('abc', (string) $this->stringable('abc')->between('', ''));
  432. $this->assertSame('b', (string) $this->stringable('abc')->between('a', 'c'));
  433. $this->assertSame('b', (string) $this->stringable('dddabc')->between('a', 'c'));
  434. $this->assertSame('b', (string) $this->stringable('abcddd')->between('a', 'c'));
  435. $this->assertSame('b', (string) $this->stringable('dddabcddd')->between('a', 'c'));
  436. $this->assertSame('nn', (string) $this->stringable('hannah')->between('ha', 'ah'));
  437. $this->assertSame('a]ab[b', (string) $this->stringable('[a]ab[b]')->between('[', ']'));
  438. $this->assertSame('foo', (string) $this->stringable('foofoobar')->between('foo', 'bar'));
  439. $this->assertSame('bar', (string) $this->stringable('foobarbar')->between('foo', 'bar'));
  440. }
  441. public function testAfter()
  442. {
  443. $this->assertSame('nah', (string) $this->stringable('hannah')->after('han'));
  444. $this->assertSame('nah', (string) $this->stringable('hannah')->after('n'));
  445. $this->assertSame('nah', (string) $this->stringable('ééé hannah')->after('han'));
  446. $this->assertSame('hannah', (string) $this->stringable('hannah')->after('xxxx'));
  447. $this->assertSame('hannah', (string) $this->stringable('hannah')->after(''));
  448. $this->assertSame('nah', (string) $this->stringable('han0nah')->after('0'));
  449. $this->assertSame('nah', (string) $this->stringable('han0nah')->after(0));
  450. $this->assertSame('nah', (string) $this->stringable('han2nah')->after(2));
  451. }
  452. public function testAfterLast()
  453. {
  454. $this->assertSame('tte', (string) $this->stringable('yvette')->afterLast('yve'));
  455. $this->assertSame('e', (string) $this->stringable('yvette')->afterLast('t'));
  456. $this->assertSame('e', (string) $this->stringable('ééé yvette')->afterLast('t'));
  457. $this->assertSame('', (string) $this->stringable('yvette')->afterLast('tte'));
  458. $this->assertSame('yvette', (string) $this->stringable('yvette')->afterLast('xxxx'));
  459. $this->assertSame('yvette', (string) $this->stringable('yvette')->afterLast(''));
  460. $this->assertSame('te', (string) $this->stringable('yv0et0te')->afterLast('0'));
  461. $this->assertSame('te', (string) $this->stringable('yv0et0te')->afterLast(0));
  462. $this->assertSame('te', (string) $this->stringable('yv2et2te')->afterLast(2));
  463. $this->assertSame('foo', (string) $this->stringable('----foo')->afterLast('---'));
  464. }
  465. public function testContains()
  466. {
  467. $this->assertTrue($this->stringable('taylor')->contains('ylo'));
  468. $this->assertTrue($this->stringable('taylor')->contains('taylor'));
  469. $this->assertTrue($this->stringable('taylor')->contains(['ylo']));
  470. $this->assertTrue($this->stringable('taylor')->contains(['xxx', 'ylo']));
  471. $this->assertFalse($this->stringable('taylor')->contains('xxx'));
  472. $this->assertFalse($this->stringable('taylor')->contains(['xxx']));
  473. $this->assertFalse($this->stringable('taylor')->contains(''));
  474. }
  475. public function testContainsAll()
  476. {
  477. $this->assertTrue($this->stringable('taylor otwell')->containsAll(['taylor', 'otwell']));
  478. $this->assertTrue($this->stringable('taylor otwell')->containsAll(['taylor']));
  479. $this->assertFalse($this->stringable('taylor otwell')->containsAll(['taylor', 'xxx']));
  480. }
  481. public function testParseCallback()
  482. {
  483. $this->assertEquals(['Class', 'method'], $this->stringable('Class@method')->parseCallback('foo'));
  484. $this->assertEquals(['Class', 'foo'], $this->stringable('Class')->parseCallback('foo'));
  485. $this->assertEquals(['Class', null], $this->stringable('Class')->parseCallback());
  486. }
  487. public function testSlug()
  488. {
  489. $this->assertSame('hello-world', (string) $this->stringable('hello world')->slug());
  490. $this->assertSame('hello-world', (string) $this->stringable('hello-world')->slug());
  491. $this->assertSame('hello-world', (string) $this->stringable('hello_world')->slug());
  492. $this->assertSame('hello_world', (string) $this->stringable('hello_world')->slug('_'));
  493. $this->assertSame('user-at-host', (string) $this->stringable('user@host')->slug());
  494. $this->assertSame('سلام-دنیا', (string) $this->stringable('سلام دنیا')->slug('-', null));
  495. $this->assertSame('sometext', (string) $this->stringable('some text')->slug(''));
  496. $this->assertSame('', (string) $this->stringable('')->slug(''));
  497. $this->assertSame('', (string) $this->stringable('')->slug());
  498. }
  499. public function testStart()
  500. {
  501. $this->assertSame('/test/string', (string) $this->stringable('test/string')->start('/'));
  502. $this->assertSame('/test/string', (string) $this->stringable('/test/string')->start('/'));
  503. $this->assertSame('/test/string', (string) $this->stringable('//test/string')->start('/'));
  504. }
  505. public function testFinish()
  506. {
  507. $this->assertSame('abbc', (string) $this->stringable('ab')->finish('bc'));
  508. $this->assertSame('abbc', (string) $this->stringable('abbcbc')->finish('bc'));
  509. $this->assertSame('abcbbc', (string) $this->stringable('abcbbcbc')->finish('bc'));
  510. }
  511. public function testIs()
  512. {
  513. $this->assertTrue($this->stringable('/')->is('/'));
  514. $this->assertFalse($this->stringable('/')->is(' /'));
  515. $this->assertFalse($this->stringable('/a')->is('/'));
  516. $this->assertTrue($this->stringable('foo/bar/baz')->is('foo/*'));
  517. $this->assertTrue($this->stringable('App\Class@method')->is('*@*'));
  518. $this->assertTrue($this->stringable('app\Class@')->is('*@*'));
  519. $this->assertTrue($this->stringable('@method')->is('*@*'));
  520. // is case sensitive
  521. $this->assertFalse($this->stringable('foo/bar/baz')->is('*BAZ*'));
  522. $this->assertFalse($this->stringable('foo/bar/baz')->is('*FOO*'));
  523. $this->assertFalse($this->stringable('a')->is('A'));
  524. // Accepts array of patterns
  525. $this->assertTrue($this->stringable('a/')->is(['a*', 'b*']));
  526. $this->assertTrue($this->stringable('b/')->is(['a*', 'b*']));
  527. $this->assertFalse($this->stringable('f/')->is(['a*', 'b*']));
  528. // numeric values and patterns
  529. $this->assertFalse($this->stringable(123)->is(['a*', 'b*']));
  530. $this->assertTrue($this->stringable(11211)->is(['*2*', 'b*']));
  531. $this->assertTrue($this->stringable('blah/baz/foo')->is('*/foo'));
  532. $valueObject = new StringableObjectStub('foo/bar/baz');
  533. $patternObject = new StringableObjectStub('foo/*');
  534. $this->assertTrue($this->stringable($valueObject)->is('foo/bar/baz'));
  535. $this->assertTrue($this->stringable($valueObject)->is($patternObject));
  536. // empty patterns
  537. $this->assertFalse($this->stringable('test')->is([]));
  538. }
  539. public function testKebab()
  540. {
  541. $this->assertSame('laravel-php-framework', (string) $this->stringable('LaravelPhpFramework')->kebab());
  542. }
  543. public function testLower()
  544. {
  545. $this->assertSame('foo bar baz', (string) $this->stringable('FOO BAR BAZ')->lower());
  546. $this->assertSame('foo bar baz', (string) $this->stringable('fOo Bar bAz')->lower());
  547. }
  548. public function testUpper()
  549. {
  550. $this->assertSame('FOO BAR BAZ', (string) $this->stringable('foo bar baz')->upper());
  551. $this->assertSame('FOO BAR BAZ', (string) $this->stringable('foO bAr BaZ')->upper());
  552. }
  553. public function testLimit()
  554. {
  555. $this->assertSame('Laravel is...',
  556. (string) $this->stringable('Laravel is a free, open source PHP web application framework.')->limit(10)
  557. );
  558. $this->assertSame('这是一...', (string) $this->stringable('这是一段中文')->limit(6));
  559. $string = 'The PHP framework for web artisans.';
  560. $this->assertSame('The PHP...', (string) $this->stringable($string)->limit(7));
  561. $this->assertSame('The PHP', (string) $this->stringable($string)->limit(7, ''));
  562. $this->assertSame('The PHP framework for web artisans.', (string) $this->stringable($string)->limit(100));
  563. $nonAsciiString = '这是一段中文';
  564. $this->assertSame('这是一...', (string) $this->stringable($nonAsciiString)->limit(6));
  565. $this->assertSame('这是一', (string) $this->stringable($nonAsciiString)->limit(6, ''));
  566. }
  567. public function testLength()
  568. {
  569. $this->assertSame(11, $this->stringable('foo bar baz')->length());
  570. $this->assertSame(11, $this->stringable('foo bar baz')->length('UTF-8'));
  571. }
  572. public function testReplace()
  573. {
  574. $this->assertSame('foo/foo/foo', (string) $this->stringable('?/?/?')->replace('?', 'foo'));
  575. $this->assertSame('bar/bar', (string) $this->stringable('?/?')->replace('?', 'bar'));
  576. $this->assertSame('?/?/?', (string) $this->stringable('? ? ?')->replace(' ', '/'));
  577. $this->assertSame('foo/bar/baz/bam', (string) $this->stringable('?1/?2/?3/?4')->replace(['?1', '?2', '?3', '?4'], ['foo', 'bar', 'baz', 'bam']));
  578. }
  579. public function testReplaceArray()
  580. {
  581. $this->assertSame('foo/bar/baz', (string) $this->stringable('?/?/?')->replaceArray('?', ['foo', 'bar', 'baz']));
  582. $this->assertSame('foo/bar/baz/?', (string) $this->stringable('?/?/?/?')->replaceArray('?', ['foo', 'bar', 'baz']));
  583. $this->assertSame('foo/bar', (string) $this->stringable('?/?')->replaceArray('?', ['foo', 'bar', 'baz']));
  584. $this->assertSame('?/?/?', (string) $this->stringable('?/?/?')->replaceArray('x', ['foo', 'bar', 'baz']));
  585. $this->assertSame('foo?/bar/baz', (string) $this->stringable('?/?/?')->replaceArray('?', ['foo?', 'bar', 'baz']));
  586. $this->assertSame('foo/bar', (string) $this->stringable('?/?')->replaceArray('?', [1 => 'foo', 2 => 'bar']));
  587. $this->assertSame('foo/bar', (string) $this->stringable('?/?')->replaceArray('?', ['x' => 'foo', 'y' => 'bar']));
  588. }
  589. public function testReplaceFirst()
  590. {
  591. $this->assertSame('fooqux foobar', (string) $this->stringable('foobar foobar')->replaceFirst('bar', 'qux'));
  592. $this->assertSame('foo/qux? foo/bar?', (string) $this->stringable('foo/bar? foo/bar?')->replaceFirst('bar?', 'qux?'));
  593. $this->assertSame('foo foobar', (string) $this->stringable('foobar foobar')->replaceFirst('bar', ''));
  594. $this->assertSame('foobar foobar', (string) $this->stringable('foobar foobar')->replaceFirst('xxx', 'yyy'));
  595. $this->assertSame('foobar foobar', (string) $this->stringable('foobar foobar')->replaceFirst('', 'yyy'));
  596. // Test for multibyte string support
  597. $this->assertSame('Jxxxnköping Malmö', (string) $this->stringable('Jönköping Malmö')->replaceFirst('ö', 'xxx'));
  598. $this->assertSame('Jönköping Malmö', (string) $this->stringable('Jönköping Malmö')->replaceFirst('', 'yyy'));
  599. }
  600. public function testReplaceLast()
  601. {
  602. $this->assertSame('foobar fooqux', (string) $this->stringable('foobar foobar')->replaceLast('bar', 'qux'));
  603. $this->assertSame('foo/bar? foo/qux?', (string) $this->stringable('foo/bar? foo/bar?')->replaceLast('bar?', 'qux?'));
  604. $this->assertSame('foobar foo', (string) $this->stringable('foobar foobar')->replaceLast('bar', ''));
  605. $this->assertSame('foobar foobar', (string) $this->stringable('foobar foobar')->replaceLast('xxx', 'yyy'));
  606. $this->assertSame('foobar foobar', (string) $this->stringable('foobar foobar')->replaceLast('', 'yyy'));
  607. // Test for multibyte string support
  608. $this->assertSame('Malmö Jönkxxxping', (string) $this->stringable('Malmö Jönköping')->replaceLast('ö', 'xxx'));
  609. $this->assertSame('Malmö Jönköping', (string) $this->stringable('Malmö Jönköping')->replaceLast('', 'yyy'));
  610. }
  611. public function testRemove()
  612. {
  613. $this->assertSame('Fbar', (string) $this->stringable('Foobar')->remove('o'));
  614. $this->assertSame('Foo', (string) $this->stringable('Foobar')->remove('bar'));
  615. $this->assertSame('oobar', (string) $this->stringable('Foobar')->remove('F'));
  616. $this->assertSame('Foobar', (string) $this->stringable('Foobar')->remove('f'));
  617. $this->assertSame('oobar', (string) $this->stringable('Foobar')->remove('f', false));
  618. $this->assertSame('Fbr', (string) $this->stringable('Foobar')->remove(['o', 'a']));
  619. $this->assertSame('Fooar', (string) $this->stringable('Foobar')->remove(['f', 'b']));
  620. $this->assertSame('ooar', (string) $this->stringable('Foobar')->remove(['f', 'b'], false));
  621. $this->assertSame('Foobar', (string) $this->stringable('Foo|bar')->remove(['f', '|']));
  622. }
  623. public function testReverse()
  624. {
  625. $this->assertSame('FooBar', (string) $this->stringable('raBooF')->reverse());
  626. $this->assertSame('Teniszütő', (string) $this->stringable('őtüzsineT')->reverse());
  627. $this->assertSame('❤MultiByte☆', (string) $this->stringable('☆etyBitluM❤')->reverse());
  628. }
  629. public function testSnake()
  630. {
  631. $this->assertSame('laravel_p_h_p_framework', (string) $this->stringable('LaravelPHPFramework')->snake());
  632. $this->assertSame('laravel_php_framework', (string) $this->stringable('LaravelPhpFramework')->snake());
  633. $this->assertSame('laravel php framework', (string) $this->stringable('LaravelPhpFramework')->snake(' '));
  634. $this->assertSame('laravel_php_framework', (string) $this->stringable('Laravel Php Framework')->snake());
  635. $this->assertSame('laravel_php_framework', (string) $this->stringable('Laravel Php Framework ')->snake());
  636. // ensure cache keys don't overlap
  637. $this->assertSame('laravel__php__framework', (string) $this->stringable('LaravelPhpFramework')->snake('__'));
  638. $this->assertSame('laravel_php_framework_', (string) $this->stringable('LaravelPhpFramework_')->snake('_'));
  639. $this->assertSame('laravel_php_framework', (string) $this->stringable('laravel php Framework')->snake());
  640. $this->assertSame('laravel_php_frame_work', (string) $this->stringable('laravel php FrameWork')->snake());
  641. // prevent breaking changes
  642. $this->assertSame('foo-bar', (string) $this->stringable('foo-bar')->snake());
  643. $this->assertSame('foo-_bar', (string) $this->stringable('Foo-Bar')->snake());
  644. $this->assertSame('foo__bar', (string) $this->stringable('Foo_Bar')->snake());
  645. $this->assertSame('żółtałódka', (string) $this->stringable('ŻółtaŁódka')->snake());
  646. }
  647. public function testStudly()
  648. {
  649. $this->assertSame('LaravelPHPFramework', (string) $this->stringable('laravel_p_h_p_framework')->studly());
  650. $this->assertSame('LaravelPhpFramework', (string) $this->stringable('laravel_php_framework')->studly());
  651. $this->assertSame('LaravelPhPFramework', (string) $this->stringable('laravel-phP-framework')->studly());
  652. $this->assertSame('LaravelPhpFramework', (string) $this->stringable('laravel -_- php -_- framework ')->studly());
  653. $this->assertSame('FooBar', (string) $this->stringable('fooBar')->studly());
  654. $this->assertSame('FooBar', (string) $this->stringable('foo_bar')->studly());
  655. $this->assertSame('FooBar', (string) $this->stringable('foo_bar')->studly()); // test cache
  656. $this->assertSame('FooBarBaz', (string) $this->stringable('foo-barBaz')->studly());
  657. $this->assertSame('FooBarBaz', (string) $this->stringable('foo-bar_baz')->studly());
  658. }
  659. public function testCamel()
  660. {
  661. $this->assertSame('laravelPHPFramework', (string) $this->stringable('Laravel_p_h_p_framework')->camel());
  662. $this->assertSame('laravelPhpFramework', (string) $this->stringable('Laravel_php_framework')->camel());
  663. $this->assertSame('laravelPhPFramework', (string) $this->stringable('Laravel-phP-framework')->camel());
  664. $this->assertSame('laravelPhpFramework', (string) $this->stringable('Laravel -_- php -_- framework ')->camel());
  665. $this->assertSame('fooBar', (string) $this->stringable('FooBar')->camel());
  666. $this->assertSame('fooBar', (string) $this->stringable('foo_bar')->camel());
  667. $this->assertSame('fooBar', (string) $this->stringable('foo_bar')->camel()); // test cache
  668. $this->assertSame('fooBarBaz', (string) $this->stringable('Foo-barBaz')->camel());
  669. $this->assertSame('fooBarBaz', (string) $this->stringable('foo-bar_baz')->camel());
  670. }
  671. public function testSubstr()
  672. {
  673. $this->assertSame('Ё', (string) $this->stringable('БГДЖИЛЁ')->substr(-1));
  674. $this->assertSame('ЛЁ', (string) $this->stringable('БГДЖИЛЁ')->substr(-2));
  675. $this->assertSame('И', (string) $this->stringable('БГДЖИЛЁ')->substr(-3, 1));
  676. $this->assertSame('ДЖИЛ', (string) $this->stringable('БГДЖИЛЁ')->substr(2, -1));
  677. $this->assertSame('', (string) $this->stringable('БГДЖИЛЁ')->substr(4, -4));
  678. $this->assertSame('ИЛ', (string) $this->stringable('БГДЖИЛЁ')->substr(-3, -1));
  679. $this->assertSame('ГДЖИЛЁ', (string) $this->stringable('БГДЖИЛЁ')->substr(1));
  680. $this->assertSame('ГДЖ', (string) $this->stringable('БГДЖИЛЁ')->substr(1, 3));
  681. $this->assertSame('БГДЖ', (string) $this->stringable('БГДЖИЛЁ')->substr(0, 4));
  682. $this->assertSame('Ё', (string) $this->stringable('БГДЖИЛЁ')->substr(-1, 1));
  683. $this->assertSame('', (string) $this->stringable('Б')->substr(2));
  684. }
  685. public function testSwap()
  686. {
  687. $this->assertSame('PHP 8 is fantastic', (string) $this->stringable('PHP is awesome')->swap([
  688. 'PHP' => 'PHP 8',
  689. 'awesome' => 'fantastic',
  690. ]));
  691. }
  692. public function testSubstrCount()
  693. {
  694. $this->assertSame(3, $this->stringable('laravelPHPFramework')->substrCount('a'));
  695. $this->assertSame(0, $this->stringable('laravelPHPFramework')->substrCount('z'));
  696. $this->assertSame(1, $this->stringable('laravelPHPFramework')->substrCount('l', 2));
  697. $this->assertSame(0, $this->stringable('laravelPHPFramework')->substrCount('z', 2));
  698. $this->assertSame(1, $this->stringable('laravelPHPFramework')->substrCount('k', -1));
  699. $this->assertSame(1, $this->stringable('laravelPHPFramework')->substrCount('k', -1));
  700. $this->assertSame(1, $this->stringable('laravelPHPFramework')->substrCount('a', 1, 2));
  701. $this->assertSame(1, $this->stringable('laravelPHPFramework')->substrCount('a', 1, 2));
  702. $this->assertSame(3, $this->stringable('laravelPHPFramework')->substrCount('a', 1, -2));
  703. $this->assertSame(1, $this->stringable('laravelPHPFramework')->substrCount('a', -10, -3));
  704. }
  705. public function testSubstrReplace()
  706. {
  707. $this->assertSame('12:00', (string) $this->stringable('1200')->substrReplace(':', 2, 0));
  708. $this->assertSame('The Laravel Framework', (string) $this->stringable('The Framework')->substrReplace('Laravel ', 4, 0));
  709. $this->assertSame('Laravel – The PHP Framework for Web Artisans', (string) $this->stringable('Laravel Framework')->substrReplace('– The PHP Framework for Web Artisans', 8));
  710. }
  711. public function testPadBoth()
  712. {
  713. $this->assertSame('__Alien___', (string) $this->stringable('Alien')->padBoth(10, '_'));
  714. $this->assertSame(' Alien ', (string) $this->stringable('Alien')->padBoth(10));
  715. $this->assertSame(' ❤MultiByte☆ ', (string) $this->stringable('❤MultiByte☆')->padBoth(16));
  716. }
  717. public function testPadLeft()
  718. {
  719. $this->assertSame('-=-=-Alien', (string) $this->stringable('Alien')->padLeft(10, '-='));
  720. $this->assertSame(' Alien', (string) $this->stringable('Alien')->padLeft(10));
  721. $this->assertSame(' ❤MultiByte☆', (string) $this->stringable('❤MultiByte☆')->padLeft(16));
  722. }
  723. public function testPadRight()
  724. {
  725. $this->assertSame('Alien-----', (string) $this->stringable('Alien')->padRight(10, '-'));
  726. $this->assertSame('Alien ', (string) $this->stringable('Alien')->padRight(10));
  727. $this->assertSame('❤MultiByte☆ ', (string) $this->stringable('❤MultiByte☆')->padRight(16));
  728. }
  729. public function testChunk()
  730. {
  731. $chunks = $this->stringable('foobarbaz')->split(3);
  732. $this->assertInstanceOf(Collection::class, $chunks);
  733. $this->assertSame(['foo', 'bar', 'baz'], $chunks->all());
  734. }
  735. public function testJsonSerialize()
  736. {
  737. $this->assertSame('"foo"', json_encode($this->stringable('foo')));
  738. }
  739. public function testTap()
  740. {
  741. $stringable = $this->stringable('foobarbaz');
  742. $fromTheTap = '';
  743. $stringable = $stringable->tap(function (Stringable $string) use (&$fromTheTap) {
  744. $fromTheTap = $string->substr(0, 3);
  745. });
  746. $this->assertSame('foo', (string) $fromTheTap);
  747. $this->assertSame('foobarbaz', (string) $stringable);
  748. }
  749. public function testPipe()
  750. {
  751. $callback = function ($stringable) {
  752. return 'bar';
  753. };
  754. $this->assertInstanceOf(Stringable::class, $this->stringable('foo')->pipe($callback));
  755. $this->assertSame('bar', (string) $this->stringable('foo')->pipe($callback));
  756. }
  757. public function testMarkdown()
  758. {
  759. $this->assertEquals("<p><em>hello world</em></p>\n", $this->stringable('*hello world*')->markdown());
  760. $this->assertEquals("<h1>hello world</h1>\n", $this->stringable('# hello world')->markdown());
  761. }
  762. public function testMask()
  763. {
  764. $this->assertEquals('tay*************', $this->stringable('taylor@email.com')->mask('*', 3));
  765. $this->assertEquals('******@email.com', $this->stringable('taylor@email.com')->mask('*', 0, 6));
  766. $this->assertEquals('tay*************', $this->stringable('taylor@email.com')->mask('*', -13));
  767. $this->assertEquals('tay***@email.com', $this->stringable('taylor@email.com')->mask('*', -13, 3));
  768. $this->assertEquals('****************', $this->stringable('taylor@email.com')->mask('*', -17));
  769. $this->assertEquals('*****r@email.com', $this->stringable('taylor@email.com')->mask('*', -99, 5));
  770. $this->assertEquals('taylor@email.com', $this->stringable('taylor@email.com')->mask('*', 16));
  771. $this->assertEquals('taylor@email.com', $this->stringable('taylor@email.com')->mask('*', 16, 99));
  772. $this->assertEquals('taylor@email.com', $this->stringable('taylor@email.com')->mask('', 3));
  773. $this->assertEquals('taysssssssssssss', $this->stringable('taylor@email.com')->mask('something', 3));
  774. $this->assertEquals('这是一***', $this->stringable('这是一段中文')->mask('*', 3));
  775. $this->assertEquals('**一段中文', $this->stringable('这是一段中文')->mask('*', 0, 2));
  776. }
  777. public function testRepeat()
  778. {
  779. $this->assertSame('aaaaa', (string) $this->stringable('a')->repeat(5));
  780. $this->assertSame('', (string) $this->stringable('')->repeat(5));
  781. }
  782. public function testWordCount()
  783. {
  784. $this->assertEquals(2, $this->stringable('Hello, world!')->wordCount());
  785. $this->assertEquals(10, $this->stringable('Hi, this is my first contribution to the Laravel framework.')->wordCount());
  786. }
  787. public function testToHtmlString()
  788. {
  789. $this->assertEquals(
  790. new HtmlString('<h1>Test String</h1>'),
  791. $this->stringable('<h1>Test String</h1>')->toHtmlString()
  792. );
  793. }
  794. public function testStripTags()
  795. {
  796. $this->assertSame('beforeafter', (string) $this->stringable('before<br>after')->stripTags());
  797. $this->assertSame('before<br>after', (string) $this->stringable('before<br>after')->stripTags('<br>'));
  798. $this->assertSame('before<br>after', (string) $this->stringable('<strong>before</strong><br>after')->stripTags('<br>'));
  799. $this->assertSame('<strong>before</strong><br>after', (string) $this->stringable('<strong>before</strong><br>after')->stripTags('<br><strong>'));
  800. }
  801. public function testScan()
  802. {
  803. $this->assertSame([123456], $this->stringable('SN/123456')->scan('SN/%d')->toArray());
  804. $this->assertSame(['Otwell', 'Taylor'], $this->stringable('Otwell, Taylor')->scan('%[^,],%s')->toArray());
  805. $this->assertSame(['filename', 'jpg'], $this->stringable('filename.jpg')->scan('%[^.].%s')->toArray());
  806. }
  807. }