2009-02-12 10:24:33 +01:00
|
|
|
<?php
|
2015-08-30 07:02:55 +02:00
|
|
|
|
2016-10-14 03:30:05 +02:00
|
|
|
namespace SilverStripe\ORM\Tests;
|
2016-06-15 06:03:16 +02:00
|
|
|
|
|
|
|
use SilverStripe\ORM\FieldType\DBField;
|
2016-08-19 00:51:35 +02:00
|
|
|
use SilverStripe\Dev\SapphireTest;
|
|
|
|
|
2009-02-12 10:24:33 +01:00
|
|
|
/**
|
2016-06-17 08:49:23 +02:00
|
|
|
* Tests parsing and summary methods on DBText
|
2009-02-12 10:24:33 +01:00
|
|
|
*/
|
2016-12-16 05:34:21 +01:00
|
|
|
class DBTextTest extends SapphireTest
|
|
|
|
{
|
2009-02-12 10:38:43 +01:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* Test {@link Text->LimitCharacters()}
|
|
|
|
*/
|
|
|
|
public function providerLimitCharacters()
|
|
|
|
{
|
|
|
|
// Plain text values always encoded safely
|
|
|
|
// HTML stored in non-html fields is treated literally.
|
|
|
|
return [
|
|
|
|
['The little brown fox jumped over the lazy cow.', 'The little brown fox...'],
|
|
|
|
['<p>Short & Sweet</p>', '<p>Short & Sweet</p>'],
|
|
|
|
['This text contains & in it', 'This text contains &...'],
|
|
|
|
];
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* Test {@link Text->LimitCharacters()}
|
|
|
|
*
|
|
|
|
* @dataProvider providerLimitCharacters
|
|
|
|
* @param string $originalValue
|
|
|
|
* @param string $expectedValue
|
|
|
|
*/
|
|
|
|
public function testLimitCharacters($originalValue, $expectedValue)
|
|
|
|
{
|
|
|
|
$textObj = DBField::create_field('Text', $originalValue);
|
|
|
|
$result = $textObj->obj('LimitCharacters')->forTemplate();
|
|
|
|
$this->assertEquals($expectedValue, $result);
|
|
|
|
}
|
2014-10-17 11:41:28 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function providerLimitCharactersToClosestWord()
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
// Standard words limited, ellipsis added if truncated
|
|
|
|
['Lorem ipsum dolor sit amet', 24, 'Lorem ipsum dolor sit...'],
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// Complete words less than the character limit don't get truncated, ellipsis not added
|
|
|
|
['Lorem ipsum', 24, 'Lorem ipsum'],
|
|
|
|
['Lorem', 24, 'Lorem'],
|
|
|
|
['', 24, ''], // No words produces nothing!
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// Special characters are encoded safely
|
|
|
|
['Nice & Easy', 24, 'Nice & Easy'],
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// HTML stored in non-html fields is treated literally.
|
|
|
|
// If storing HTML you should use DBHTMLText instead
|
|
|
|
['<p>Lorem ipsum dolor sit amet</p>', 24, '<p>Lorem ipsum dolor...'],
|
|
|
|
['<p><span>Lorem ipsum dolor sit amet</span></p>', 24, '<p><span>Lorem ipsum...'],
|
|
|
|
['<p>Lorem ipsum</p>', 24, '<p>Lorem ipsum</p>'],
|
|
|
|
['Lorem & ipsum dolor sit amet', 24, 'Lorem &amp; ipsum dolor...']
|
|
|
|
];
|
|
|
|
}
|
2009-02-12 10:24:33 +01:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* Test {@link Text->LimitCharactersToClosestWord()}
|
|
|
|
*
|
|
|
|
* @dataProvider providerLimitCharactersToClosestWord
|
|
|
|
*
|
|
|
|
* @param string $originalValue Raw string input
|
|
|
|
* @param int $limit
|
|
|
|
* @param string $expectedValue Expected template value
|
|
|
|
*/
|
|
|
|
public function testLimitCharactersToClosestWord($originalValue, $limit, $expectedValue)
|
|
|
|
{
|
|
|
|
$textObj = DBField::create_field('Text', $originalValue);
|
|
|
|
$result = $textObj->obj('LimitCharactersToClosestWord', [$limit])->forTemplate();
|
|
|
|
$this->assertEquals($expectedValue, $result);
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* Test {@link Text->LimitWordCount()}
|
|
|
|
*/
|
|
|
|
public function providerLimitWordCount()
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
// Standard words limited, ellipsis added if truncated
|
|
|
|
['The little brown fox jumped over the lazy cow.', 3, 'The little brown...'],
|
|
|
|
[' This text has white space around the ends ', 3, 'This text has...'],
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// Words less than the limt word count don't get truncated, ellipsis not added
|
|
|
|
['Two words', 3, 'Two words'], // Two words shouldn't have an ellipsis
|
|
|
|
['These three words', 3, 'These three words'], // Three words shouldn't have an ellipsis
|
|
|
|
['One', 3, 'One'], // Neither should one word
|
|
|
|
['', 3, ''], // No words produces nothing!
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// Text with special characters
|
|
|
|
['Nice & Easy', 3, 'Nice & Easy'],
|
|
|
|
['One & Two & Three', 3, 'One & Two...'],
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// HTML stored in non-html fields is treated literally.
|
|
|
|
// If storing HTML you should use DBHTMLText instead
|
|
|
|
['<p>Text inside a paragraph tag should also work</p>', 3, '<p>Text inside a...'],
|
|
|
|
['<p>Two words</p>', 3, '<p>Two words</p>'],
|
|
|
|
];
|
|
|
|
}
|
2014-05-26 02:57:12 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* Test {@link DBText->LimitWordCount()}
|
|
|
|
*
|
|
|
|
* @dataProvider providerLimitWordCount
|
|
|
|
*
|
|
|
|
* @param string $originalValue Raw string input
|
|
|
|
* @param int $limit Number of words
|
|
|
|
* @param string $expectedValue Expected template value
|
|
|
|
*/
|
|
|
|
public function testLimitWordCount($originalValue, $limit, $expectedValue)
|
|
|
|
{
|
|
|
|
$textObj = DBField::create_field('Text', $originalValue);
|
|
|
|
$result = $textObj->obj('LimitWordCount', [$limit])->forTemplate();
|
|
|
|
$this->assertEquals($expectedValue, $result);
|
|
|
|
}
|
2014-10-01 05:02:28 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function providerLimitSentences()
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
['', 2, ''],
|
|
|
|
['First sentence.', 2, 'First sentence.'],
|
|
|
|
['First sentence. Second sentence.', 2, 'First sentence. Second sentence.'],
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// HTML stored in non-html fields is treated literally.
|
|
|
|
// If storing HTML you should use DBHTMLText instead
|
|
|
|
['<p>First sentence.</p>', 2, '<p>First sentence.</p>'],
|
|
|
|
['<p>First sentence. Second sentence. Third sentence</p>', 2, '<p>First sentence. Second sentence.'],
|
|
|
|
];
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* Test {@link DBText->LimitSentences()}
|
|
|
|
*
|
|
|
|
* @dataProvider providerLimitSentences
|
|
|
|
* @param string $originalValue
|
|
|
|
* @param int $limit Number of sentences
|
|
|
|
* @param string $expectedValue Expected template value
|
2016-06-17 08:49:23 +02:00
|
|
|
*/
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testLimitSentences($originalValue, $limit, $expectedValue)
|
|
|
|
{
|
|
|
|
$textObj = DBField::create_field('Text', $originalValue);
|
|
|
|
$result = $textObj->obj('LimitSentences', [$limit])->forTemplate();
|
|
|
|
$this->assertEquals($expectedValue, $result);
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
public function providerFirstSentence()
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
['', ''],
|
|
|
|
['First sentence.', 'First sentence.'],
|
|
|
|
['First sentence. Second sentence', 'First sentence.'],
|
|
|
|
['First sentence? Second sentence', 'First sentence?'],
|
|
|
|
['First sentence! Second sentence', 'First sentence!'],
|
2016-06-17 08:49:23 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
// HTML stored in non-html fields is treated literally.
|
|
|
|
// If storing HTML you should use DBHTMLText instead
|
|
|
|
['<br />First sentence.', '<br />First sentence.'],
|
|
|
|
['<p>First sentence. Second sentence. Third sentence</p>', '<p>First sentence.'],
|
|
|
|
];
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* @dataProvider providerFirstSentence
|
|
|
|
* @param string $originalValue
|
|
|
|
* @param string $expectedValue
|
2016-06-17 08:49:23 +02:00
|
|
|
*/
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testFirstSentence($originalValue, $expectedValue)
|
|
|
|
{
|
|
|
|
$textObj = DBField::create_field('Text', $originalValue);
|
|
|
|
$result = $textObj->obj('FirstSentence')->forTemplate();
|
|
|
|
$this->assertEquals($expectedValue, $result);
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* each test is in the format input, charactere limit, highlight, expected output
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function providerContextSummary()
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
[
|
|
|
|
'This is some text. It is a test',
|
|
|
|
20,
|
|
|
|
'test',
|
|
|
|
'... text. It is a <span class="highlight">test</span>'
|
|
|
|
],
|
|
|
|
[
|
|
|
|
// Retains case of original string
|
|
|
|
'This is some test text. Test test what if you have multiple keywords.',
|
|
|
|
50,
|
|
|
|
'some test',
|
|
|
|
'This is <span class="highlight">some</span> <span class="highlight">test</span> text.'
|
|
|
|
. ' <span class="highlight">Test</span> <span class="highlight">test</span> what if you have...'
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'Here is some text & HTML included',
|
|
|
|
20,
|
|
|
|
'html',
|
|
|
|
'... text & <span class="highlight">HTML</span> inc...'
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'A dog ate a cat while looking at a Foobar',
|
|
|
|
100,
|
|
|
|
'a',
|
|
|
|
// test that it does not highlight too much (eg every a)
|
|
|
|
'A dog ate a cat while looking at a Foobar',
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'A dog ate a cat while looking at a Foobar',
|
|
|
|
100,
|
|
|
|
'ate',
|
|
|
|
// it should highlight 3 letters or more.
|
|
|
|
'A dog <span class="highlight">ate</span> a cat while looking at a Foobar',
|
|
|
|
]
|
|
|
|
];
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
/**
|
|
|
|
* @dataProvider providerContextSummary
|
|
|
|
* @param string $originalValue Input
|
|
|
|
* @param int $limit Numer of characters
|
|
|
|
* @param string $keywords Keywords to highlight
|
|
|
|
* @param string $expectedValue Expected output (XML encoded safely)
|
2016-06-17 08:49:23 +02:00
|
|
|
*/
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testContextSummary($originalValue, $limit, $keywords, $expectedValue)
|
|
|
|
{
|
|
|
|
$text = DBField::create_field('Text', $originalValue);
|
|
|
|
$result = $text->obj('ContextSummary', [$limit, $keywords])->forTemplate();
|
|
|
|
// it should highlight 3 letters or more.
|
|
|
|
$this->assertEquals($expectedValue, $result);
|
|
|
|
}
|
2012-01-31 01:07:24 +01:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testRAW()
|
|
|
|
{
|
|
|
|
$data = DBField::create_field('Text', 'This & This');
|
|
|
|
$this->assertEquals($data->RAW(), 'This & This');
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testXML()
|
|
|
|
{
|
|
|
|
$data = DBField::create_field('Text', 'This & This');
|
|
|
|
$this->assertEquals($data->XML(), 'This & This');
|
|
|
|
}
|
2012-01-31 01:07:24 +01:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testHTML()
|
|
|
|
{
|
|
|
|
$data = DBField::create_field('Text', 'This & This');
|
|
|
|
$this->assertEquals($data->HTML(), 'This & This');
|
|
|
|
}
|
2012-01-31 01:07:24 +01:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testJS()
|
|
|
|
{
|
|
|
|
$data = DBField::create_field('Text', '"this is a test"');
|
|
|
|
$this->assertEquals($data->JS(), '\"this is a test\"');
|
|
|
|
}
|
2012-01-31 01:07:24 +01:00
|
|
|
|
2016-12-16 05:34:21 +01:00
|
|
|
public function testATT()
|
|
|
|
{
|
|
|
|
$data = DBField::create_field('Text', '"this is a test"');
|
|
|
|
$this->assertEquals($data->ATT(), '"this is a test"');
|
|
|
|
}
|
2012-03-24 04:04:52 +01:00
|
|
|
}
|