Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
91e4ad59
Commit
91e4ad59
authored
Mar 17, 2014
by
David Renty
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PSR-2 compliance
parent
0fa5230c
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
854 additions
and
852 deletions
+854
-852
Formatter.php
framework/base/Formatter.php
+519
-517
FormatterTest.php
tests/unit/framework/base/FormatterTest.php
+335
-335
No files found.
framework/base/Formatter.php
View file @
91e4ad59
...
...
@@ -27,521 +27,523 @@ use yii\helpers\Html;
*/
class
Formatter
extends
Component
{
/**
* @var string the timezone to use for formatting time and date values.
* This can be any value that may be passed to [date_default_timezone_set()](http://www.php.net/manual/en/function.date-default-timezone-set.php)
* e.g. `UTC`, `Europe/Berlin` or `America/Chicago`.
* Refer to the [php manual](http://www.php.net/manual/en/timezones.php) for available timezones.
* If this property is not set, [[\yii\base\Application::timezone]] will be used.
*/
public
$timeZone
;
/**
* @var string the default format string to be used to format a date using PHP date() function.
*/
public
$dateFormat
=
'Y/m/d'
;
/**
* @var string the default format string to be used to format a time using PHP date() function.
*/
public
$timeFormat
=
'h:i:s A'
;
/**
* @var string the default format string to be used to format a date and time using PHP date() function.
*/
public
$datetimeFormat
=
'Y/m/d h:i:s A'
;
/**
* @var string the text to be displayed when formatting a null. Defaults to '<span class="not-set">(not set)</span>'.
*/
public
$nullDisplay
;
/**
* @var array the text to be displayed when formatting a boolean value. The first element corresponds
* to the text display for false, the second element for true. Defaults to `['No', 'Yes']`.
*/
public
$booleanFormat
;
/**
* @var string the character displayed as the decimal point when formatting a number.
* If not set, "." will be used.
*/
public
$decimalSeparator
;
/**
* @var string the character displayed as the thousands separator character when formatting a number.
* If not set, "," will be used.
*/
public
$thousandSeparator
;
/**
* @var array the format used to format size (bytes). Three elements may be specified: "base", "decimals" and "decimalSeparator".
* They correspond to the base at which a kilobyte is calculated (1000 or 1024 bytes per kilobyte, defaults to 1024),
* the number of digits after the decimal point (defaults to 2) and the character displayed as the decimal point.
*/
public
$sizeFormat
=
[
'base'
=>
1024
,
'decimals'
=>
2
,
'decimalSeparator'
=>
null
,
];
/**
* Initializes the component.
*/
public
function
init
()
{
if
(
$this
->
timeZone
===
null
)
{
$this
->
timeZone
=
Yii
::
$app
->
timeZone
;
}
if
(
empty
(
$this
->
booleanFormat
))
{
$this
->
booleanFormat
=
[
Yii
::
t
(
'yii'
,
'No'
),
Yii
::
t
(
'yii'
,
'Yes'
)];
}
if
(
$this
->
nullDisplay
===
null
)
{
$this
->
nullDisplay
=
'<span class="not-set">'
.
Yii
::
t
(
'yii'
,
'(not set)'
)
.
'</span>'
;
}
}
/**
* Formats the value based on the given format type.
* This method will call one of the "as" methods available in this class to do the formatting.
* For type "xyz", the method "asXyz" will be used. For example, if the format is "html",
* then [[asHtml()]] will be used. Format names are case insensitive.
* @param mixed $value the value to be formatted
* @param string|array $format the format of the value, e.g., "html", "text". To specify additional
* parameters of the formatting method, you may use an array. The first element of the array
* specifies the format name, while the rest of the elements will be used as the parameters to the formatting
* method. For example, a format of `['date', 'Y-m-d']` will cause the invocation of `asDate($value, 'Y-m-d')`.
* @return string the formatting result
* @throws InvalidParamException if the type is not supported by this class.
*/
public
function
format
(
$value
,
$format
)
{
if
(
is_array
(
$format
))
{
if
(
!
isset
(
$format
[
0
]))
{
throw
new
InvalidParamException
(
'The $format array must contain at least one element.'
);
}
$f
=
$format
[
0
];
$format
[
0
]
=
$value
;
$params
=
$format
;
$format
=
$f
;
}
else
{
$params
=
[
$value
];
}
$method
=
'as'
.
$format
;
if
(
$this
->
hasMethod
(
$method
))
{
return
call_user_func_array
([
$this
,
$method
],
$params
);
}
else
{
throw
new
InvalidParamException
(
"Unknown type:
$format
"
);
}
}
/**
* Formats the value as is without any formatting.
* This method simply returns back the parameter without any format.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asRaw
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
$value
;
}
/**
* Formats the value as an HTML-encoded plain text.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asText
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
Html
::
encode
(
$value
);
}
/**
* Formats the value as an HTML-encoded plain text with newlines converted into breaks.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asNtext
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
nl2br
(
Html
::
encode
(
$value
));
}
/**
* Formats the value as HTML-encoded text paragraphs.
* Each text paragraph is enclosed within a `<p>` tag.
* One or multiple consecutive empty lines divide two paragraphs.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asParagraphs
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
str_replace
(
'<p></p>'
,
''
,
'<p>'
.
preg_replace
(
'/[\r\n]{2,}/'
,
"</p>
\n
<p>"
,
Html
::
encode
(
$value
))
.
'</p>'
);
}
/**
* Formats the value as HTML text.
* The value will be purified using [[HtmlPurifier]] to avoid XSS attacks.
* Use [[asRaw()]] if you do not want any purification of the value.
* @param mixed $value the value to be formatted
* @param array|null $config the configuration for the HTMLPurifier class.
* @return string the formatted result
*/
public
function
asHtml
(
$value
,
$config
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
HtmlPurifier
::
process
(
$value
,
$config
);
}
/**
* Formats the value as a mailto link.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asEmail
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
Html
::
mailto
(
Html
::
encode
(
$value
),
$value
);
}
/**
* Formats the value as an image tag.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asImage
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
Html
::
img
(
$value
);
}
/**
* Formats the value as a hyperlink.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asUrl
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$url
=
$value
;
if
(
strpos
(
$url
,
'http://'
)
!==
0
&&
strpos
(
$url
,
'https://'
)
!==
0
)
{
$url
=
'http://'
.
$url
;
}
return
Html
::
a
(
Html
::
encode
(
$value
),
$url
);
}
/**
* Formats the value as a boolean.
* @param mixed $value the value to be formatted
* @return string the formatted result
* @see booleanFormat
*/
public
function
asBoolean
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
$value
?
$this
->
booleanFormat
[
1
]
:
$this
->
booleanFormat
[
0
];
}
/**
* Formats the value as a date.
* @param integer|string|DateTime $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()`
* - a PHP DateTime object
*
* @param string $format the format used to convert the value into a date string.
* If null, [[dateFormat]] will be used. The format string should be one
* that can be recognized by the PHP `date()` function.
* @return string the formatted result
* @see dateFormat
*/
public
function
asDate
(
$value
,
$format
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$value
=
$this
->
normalizeDatetimeValue
(
$value
);
return
$this
->
formatTimestamp
(
$value
,
$format
===
null
?
$this
->
dateFormat
:
$format
);
}
/**
* Formats the value as a time.
* @param integer|string|DateTime $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()`
* - a PHP DateTime object
*
* @param string $format the format used to convert the value into a date string.
* If null, [[timeFormat]] will be used. The format string should be one
* that can be recognized by the PHP `date()` function.
* @return string the formatted result
* @see timeFormat
*/
public
function
asTime
(
$value
,
$format
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$value
=
$this
->
normalizeDatetimeValue
(
$value
);
return
$this
->
formatTimestamp
(
$value
,
$format
===
null
?
$this
->
timeFormat
:
$format
);
}
/**
* Formats the value as a datetime.
* @param integer|string|DateTime $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()`
* - a PHP DateTime object
*
* @param string $format the format used to convert the value into a date string.
* If null, [[datetimeFormat]] will be used. The format string should be one
* that can be recognized by the PHP `date()` function.
* @return string the formatted result
* @see datetimeFormat
*/
public
function
asDatetime
(
$value
,
$format
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$value
=
$this
->
normalizeDatetimeValue
(
$value
);
return
$this
->
formatTimestamp
(
$value
,
$format
===
null
?
$this
->
datetimeFormat
:
$format
);
}
/**
* Normalizes the given datetime value as one that can be taken by various date/time formatting methods.
* @param mixed $value the datetime value to be normalized.
* @return integer the normalized datetime value
*/
protected
function
normalizeDatetimeValue
(
$value
)
{
if
(
is_string
(
$value
))
{
return
is_numeric
(
$value
)
||
$value
===
''
?
(
int
)
$value
:
strtotime
(
$value
);
}
elseif
(
$value
instanceof
DateTime
)
{
return
$value
->
getTimestamp
();
}
else
{
return
(
int
)
$value
;
}
}
/**
* @param integer $value normalized datetime value
* @param string $format the format used to convert the value into a date string.
* @return string the formatted result
*/
protected
function
formatTimestamp
(
$value
,
$format
)
{
$date
=
new
DateTime
(
null
,
new
\DateTimeZone
(
$this
->
timeZone
));
$date
->
setTimestamp
(
$value
);
return
$date
->
format
(
$format
);
}
/**
* Formats the value as an integer.
* @param mixed $value the value to be formatted
* @return string the formatting result.
*/
public
function
asInteger
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
if
(
is_string
(
$value
)
&&
preg_match
(
'/^(-?\d+)/'
,
$value
,
$matches
))
{
return
$matches
[
1
];
}
else
{
$value
=
(
int
)
$value
;
return
"
$value
"
;
}
}
/**
* Formats the value as a double number.
* Property [[decimalSeparator]] will be used to represent the decimal point.
* @param mixed $value the value to be formatted
* @param integer $decimals the number of digits after the decimal point
* @return string the formatting result.
* @see decimalSeparator
*/
public
function
asDouble
(
$value
,
$decimals
=
2
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
if
(
$this
->
decimalSeparator
===
null
)
{
return
sprintf
(
"%.
{
$decimals
}
f"
,
$value
);
}
else
{
return
str_replace
(
'.'
,
$this
->
decimalSeparator
,
sprintf
(
"%.
{
$decimals
}
f"
,
$value
));
}
}
/**
* Formats the value as a number with decimal and thousand separators.
* This method calls the PHP number_format() function to do the formatting.
* @param mixed $value the value to be formatted
* @param integer $decimals the number of digits after the decimal point
* @return string the formatted result
* @see decimalSeparator
* @see thousandSeparator
*/
public
function
asNumber
(
$value
,
$decimals
=
0
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$ds
=
isset
(
$this
->
decimalSeparator
)
?
$this
->
decimalSeparator
:
'.'
;
$ts
=
isset
(
$this
->
thousandSeparator
)
?
$this
->
thousandSeparator
:
','
;
return
number_format
(
$value
,
$decimals
,
$ds
,
$ts
);
}
/**
* Formats the value in bytes as a size in human readable form.
* @param integer $value value in bytes to be formatted
* @param boolean $verbose if full names should be used (e.g. bytes, kilobytes, ...).
* Defaults to false meaning that short names will be used (e.g. B, KB, ...).
* @return string the formatted result
* @see sizeFormat
*/
public
function
asSize
(
$value
,
$verbose
=
false
)
{
$position
=
0
;
do
{
if
(
$value
<
$this
->
sizeFormat
[
'base'
])
{
break
;
}
$value
=
$value
/
$this
->
sizeFormat
[
'base'
];
$position
++
;
}
while
(
$position
<
6
);
$value
=
round
(
$value
,
$this
->
sizeFormat
[
'decimals'
]);
$formattedValue
=
isset
(
$this
->
sizeFormat
[
'decimalSeparator'
])
?
str_replace
(
'.'
,
$this
->
sizeFormat
[
'decimalSeparator'
],
$value
)
:
$value
;
$params
=
[
'n'
=>
$formattedValue
];
switch
(
$position
)
{
case
0
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# byte} other{# bytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} B'
,
$params
);
case
1
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# kilobyte} other{# kilobytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} KB'
,
$params
);
case
2
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# megabyte} other{# megabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} MB'
,
$params
);
case
3
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# gigabyte} other{# gigabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} GB'
,
$params
);
case
4
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# terabyte} other{# terabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} TB'
,
$params
);
default
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# petabyte} other{# petabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} PB'
,
$params
);
}
}
/**
* Formats the value as the time interval between a date and now in human readable form.
* @param integer|string|DateTime|DateInterval $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()` or that can be passed to a DateInterval constructor.
* - a PHP DateTime object
* - a PHP DateInterval object
*
* @return string the formatted result
*/
public
function
asRelativeTime
(
$value
,
$referenceTime
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
if
(
$value
instanceof
\DateInterval
)
{
$interval
=
$value
;
}
else
{
$timestamp
=
$this
->
normalizeDatetimeValue
(
$value
);
if
(
$timestamp
===
false
)
{
// $value is not a valid date/time value, so we try
// to create a DateInterval with it
try
{
$interval
=
new
\DateInterval
(
$value
);
}
catch
(
Exception
$e
)
{
// invalid date/time and invalid interval
return
$this
->
nullDisplay
;
}
}
else
{
$timezone
=
new
\DateTimeZone
(
$this
->
timeZone
);
if
(
$referenceTime
===
null
)
{
$dateNow
=
new
DateTime
(
'now'
,
$timezone
);
}
else
{
$referenceTime
=
$this
->
normalizeDatetimeValue
(
$referenceTime
);
$dateNow
=
new
DateTime
(
null
,
$timezone
);
$dateNow
->
setTimestamp
(
$referenceTime
);
}
$dateThen
=
new
DateTime
(
null
,
$timezone
);
$dateThen
->
setTimestamp
(
$timestamp
);
$interval
=
$dateThen
->
diff
(
$dateNow
);
}
}
if
(
$interval
->
invert
)
{
if
(
$interval
->
y
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a year} other{# years}}'
,
[
'delta'
=>
$interval
->
y
]);
}
if
(
$interval
->
m
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a month} other{# months}}'
,
[
'delta'
=>
$interval
->
m
]);
}
if
(
$interval
->
d
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a day} other{# days}}'
,
[
'delta'
=>
$interval
->
d
]);
}
if
(
$interval
->
h
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{an hour} other{# hours}}'
,
[
'delta'
=>
$interval
->
h
]);
}
if
(
$interval
->
i
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a minute} other{# minutes}}'
,
[
'delta'
=>
$interval
->
i
]);
}
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a second} other{# seconds}}'
,
[
'delta'
=>
$interval
->
s
]);
}
else
{
if
(
$interval
->
y
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a year} other{# years}} ago'
,
[
'delta'
=>
$interval
->
y
]);
}
if
(
$interval
->
m
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a month} other{# months}} ago'
,
[
'delta'
=>
$interval
->
m
]);
}
if
(
$interval
->
d
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a day} other{# days}} ago'
,
[
'delta'
=>
$interval
->
d
]);
}
if
(
$interval
->
h
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{an hour} other{# hours}} ago'
,
[
'delta'
=>
$interval
->
h
]);
}
if
(
$interval
->
i
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a minute} other{# minutes}} ago'
,
[
'delta'
=>
$interval
->
i
]);
}
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a second} other{# seconds}} ago'
,
[
'delta'
=>
$interval
->
s
]);
}
}
/**
* @var string the timezone to use for formatting time and date values.
* This can be any value that may be passed to [date_default_timezone_set()](http://www.php.net/manual/en/function.date-default-timezone-set.php)
* e.g. `UTC`, `Europe/Berlin` or `America/Chicago`.
* Refer to the [php manual](http://www.php.net/manual/en/timezones.php) for available timezones.
* If this property is not set, [[\yii\base\Application::timezone]] will be used.
*/
public
$timeZone
;
/**
* @var string the default format string to be used to format a date using PHP date() function.
*/
public
$dateFormat
=
'Y/m/d'
;
/**
* @var string the default format string to be used to format a time using PHP date() function.
*/
public
$timeFormat
=
'h:i:s A'
;
/**
* @var string the default format string to be used to format a date and time using PHP date() function.
*/
public
$datetimeFormat
=
'Y/m/d h:i:s A'
;
/**
* @var string the text to be displayed when formatting a null. Defaults to '<span class="not-set">(not set)</span>'.
*/
public
$nullDisplay
;
/**
* @var array the text to be displayed when formatting a boolean value. The first element corresponds
* to the text display for false, the second element for true. Defaults to `['No', 'Yes']`.
*/
public
$booleanFormat
;
/**
* @var string the character displayed as the decimal point when formatting a number.
* If not set, "." will be used.
*/
public
$decimalSeparator
;
/**
* @var string the character displayed as the thousands separator character when formatting a number.
* If not set, "," will be used.
*/
public
$thousandSeparator
;
/**
* @var array the format used to format size (bytes). Three elements may be specified: "base", "decimals" and "decimalSeparator".
* They correspond to the base at which a kilobyte is calculated (1000 or 1024 bytes per kilobyte, defaults to 1024),
* the number of digits after the decimal point (defaults to 2) and the character displayed as the decimal point.
*/
public
$sizeFormat
=
[
'base'
=>
1024
,
'decimals'
=>
2
,
'decimalSeparator'
=>
null
,
];
/**
* Initializes the component.
*/
public
function
init
()
{
if
(
$this
->
timeZone
===
null
)
{
$this
->
timeZone
=
Yii
::
$app
->
timeZone
;
}
if
(
empty
(
$this
->
booleanFormat
))
{
$this
->
booleanFormat
=
[
Yii
::
t
(
'yii'
,
'No'
),
Yii
::
t
(
'yii'
,
'Yes'
)];
}
if
(
$this
->
nullDisplay
===
null
)
{
$this
->
nullDisplay
=
'<span class="not-set">'
.
Yii
::
t
(
'yii'
,
'(not set)'
)
.
'</span>'
;
}
}
/**
* Formats the value based on the given format type.
* This method will call one of the "as" methods available in this class to do the formatting.
* For type "xyz", the method "asXyz" will be used. For example, if the format is "html",
* then [[asHtml()]] will be used. Format names are case insensitive.
* @param mixed $value the value to be formatted
* @param string|array $format the format of the value, e.g., "html", "text". To specify additional
* parameters of the formatting method, you may use an array. The first element of the array
* specifies the format name, while the rest of the elements will be used as the parameters to the formatting
* method. For example, a format of `['date', 'Y-m-d']` will cause the invocation of `asDate($value, 'Y-m-d')`.
* @return string the formatting result
* @throws InvalidParamException if the type is not supported by this class.
*/
public
function
format
(
$value
,
$format
)
{
if
(
is_array
(
$format
))
{
if
(
!
isset
(
$format
[
0
]))
{
throw
new
InvalidParamException
(
'The $format array must contain at least one element.'
);
}
$f
=
$format
[
0
];
$format
[
0
]
=
$value
;
$params
=
$format
;
$format
=
$f
;
}
else
{
$params
=
[
$value
];
}
$method
=
'as'
.
$format
;
if
(
$this
->
hasMethod
(
$method
))
{
return
call_user_func_array
([
$this
,
$method
],
$params
);
}
else
{
throw
new
InvalidParamException
(
"Unknown type:
$format
"
);
}
}
/**
* Formats the value as is without any formatting.
* This method simply returns back the parameter without any format.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asRaw
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
$value
;
}
/**
* Formats the value as an HTML-encoded plain text.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asText
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
Html
::
encode
(
$value
);
}
/**
* Formats the value as an HTML-encoded plain text with newlines converted into breaks.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asNtext
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
nl2br
(
Html
::
encode
(
$value
));
}
/**
* Formats the value as HTML-encoded text paragraphs.
* Each text paragraph is enclosed within a `<p>` tag.
* One or multiple consecutive empty lines divide two paragraphs.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asParagraphs
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
str_replace
(
'<p></p>'
,
''
,
'<p>'
.
preg_replace
(
'/[\r\n]{2,}/'
,
"</p>
\n
<p>"
,
Html
::
encode
(
$value
))
.
'</p>'
);
}
/**
* Formats the value as HTML text.
* The value will be purified using [[HtmlPurifier]] to avoid XSS attacks.
* Use [[asRaw()]] if you do not want any purification of the value.
* @param mixed $value the value to be formatted
* @param array|null $config the configuration for the HTMLPurifier class.
* @return string the formatted result
*/
public
function
asHtml
(
$value
,
$config
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
HtmlPurifier
::
process
(
$value
,
$config
);
}
/**
* Formats the value as a mailto link.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asEmail
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
Html
::
mailto
(
Html
::
encode
(
$value
),
$value
);
}
/**
* Formats the value as an image tag.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asImage
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
Html
::
img
(
$value
);
}
/**
* Formats the value as a hyperlink.
* @param mixed $value the value to be formatted
* @return string the formatted result
*/
public
function
asUrl
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$url
=
$value
;
if
(
strpos
(
$url
,
'http://'
)
!==
0
&&
strpos
(
$url
,
'https://'
)
!==
0
)
{
$url
=
'http://'
.
$url
;
}
return
Html
::
a
(
Html
::
encode
(
$value
),
$url
);
}
/**
* Formats the value as a boolean.
* @param mixed $value the value to be formatted
* @return string the formatted result
* @see booleanFormat
*/
public
function
asBoolean
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
return
$value
?
$this
->
booleanFormat
[
1
]
:
$this
->
booleanFormat
[
0
];
}
/**
* Formats the value as a date.
* @param integer|string|DateTime $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()`
* - a PHP DateTime object
*
* @param string $format the format used to convert the value into a date string.
* If null, [[dateFormat]] will be used. The format string should be one
* that can be recognized by the PHP `date()` function.
* @return string the formatted result
* @see dateFormat
*/
public
function
asDate
(
$value
,
$format
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$value
=
$this
->
normalizeDatetimeValue
(
$value
);
return
$this
->
formatTimestamp
(
$value
,
$format
===
null
?
$this
->
dateFormat
:
$format
);
}
/**
* Formats the value as a time.
* @param integer|string|DateTime $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()`
* - a PHP DateTime object
*
* @param string $format the format used to convert the value into a date string.
* If null, [[timeFormat]] will be used. The format string should be one
* that can be recognized by the PHP `date()` function.
* @return string the formatted result
* @see timeFormat
*/
public
function
asTime
(
$value
,
$format
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$value
=
$this
->
normalizeDatetimeValue
(
$value
);
return
$this
->
formatTimestamp
(
$value
,
$format
===
null
?
$this
->
timeFormat
:
$format
);
}
/**
* Formats the value as a datetime.
* @param integer|string|DateTime $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()`
* - a PHP DateTime object
*
* @param string $format the format used to convert the value into a date string.
* If null, [[datetimeFormat]] will be used. The format string should be one
* that can be recognized by the PHP `date()` function.
* @return string the formatted result
* @see datetimeFormat
*/
public
function
asDatetime
(
$value
,
$format
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$value
=
$this
->
normalizeDatetimeValue
(
$value
);
return
$this
->
formatTimestamp
(
$value
,
$format
===
null
?
$this
->
datetimeFormat
:
$format
);
}
/**
* Normalizes the given datetime value as one that can be taken by various date/time formatting methods.
* @param mixed $value the datetime value to be normalized.
* @return integer the normalized datetime value
*/
protected
function
normalizeDatetimeValue
(
$value
)
{
if
(
is_string
(
$value
))
{
return
is_numeric
(
$value
)
||
$value
===
''
?
(
int
)
$value
:
strtotime
(
$value
);
}
elseif
(
$value
instanceof
DateTime
)
{
return
$value
->
getTimestamp
();
}
else
{
return
(
int
)
$value
;
}
}
/**
* @param integer $value normalized datetime value
* @param string $format the format used to convert the value into a date string.
* @return string the formatted result
*/
protected
function
formatTimestamp
(
$value
,
$format
)
{
$date
=
new
DateTime
(
null
,
new
\DateTimeZone
(
$this
->
timeZone
));
$date
->
setTimestamp
(
$value
);
return
$date
->
format
(
$format
);
}
/**
* Formats the value as an integer.
* @param mixed $value the value to be formatted
* @return string the formatting result.
*/
public
function
asInteger
(
$value
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
if
(
is_string
(
$value
)
&&
preg_match
(
'/^(-?\d+)/'
,
$value
,
$matches
))
{
return
$matches
[
1
];
}
else
{
$value
=
(
int
)
$value
;
return
"
$value
"
;
}
}
/**
* Formats the value as a double number.
* Property [[decimalSeparator]] will be used to represent the decimal point.
* @param mixed $value the value to be formatted
* @param integer $decimals the number of digits after the decimal point
* @return string the formatting result.
* @see decimalSeparator
*/
public
function
asDouble
(
$value
,
$decimals
=
2
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
if
(
$this
->
decimalSeparator
===
null
)
{
return
sprintf
(
"%.
{
$decimals
}
f"
,
$value
);
}
else
{
return
str_replace
(
'.'
,
$this
->
decimalSeparator
,
sprintf
(
"%.
{
$decimals
}
f"
,
$value
));
}
}
/**
* Formats the value as a number with decimal and thousand separators.
* This method calls the PHP number_format() function to do the formatting.
* @param mixed $value the value to be formatted
* @param integer $decimals the number of digits after the decimal point
* @return string the formatted result
* @see decimalSeparator
* @see thousandSeparator
*/
public
function
asNumber
(
$value
,
$decimals
=
0
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
$ds
=
isset
(
$this
->
decimalSeparator
)
?
$this
->
decimalSeparator
:
'.'
;
$ts
=
isset
(
$this
->
thousandSeparator
)
?
$this
->
thousandSeparator
:
','
;
return
number_format
(
$value
,
$decimals
,
$ds
,
$ts
);
}
/**
* Formats the value in bytes as a size in human readable form.
* @param integer $value value in bytes to be formatted
* @param boolean $verbose if full names should be used (e.g. bytes, kilobytes, ...).
* Defaults to false meaning that short names will be used (e.g. B, KB, ...).
* @return string the formatted result
* @see sizeFormat
*/
public
function
asSize
(
$value
,
$verbose
=
false
)
{
$position
=
0
;
do
{
if
(
$value
<
$this
->
sizeFormat
[
'base'
])
{
break
;
}
$value
=
$value
/
$this
->
sizeFormat
[
'base'
];
$position
++
;
}
while
(
$position
<
6
);
$value
=
round
(
$value
,
$this
->
sizeFormat
[
'decimals'
]);
$formattedValue
=
isset
(
$this
->
sizeFormat
[
'decimalSeparator'
])
?
str_replace
(
'.'
,
$this
->
sizeFormat
[
'decimalSeparator'
],
$value
)
:
$value
;
$params
=
[
'n'
=>
$formattedValue
];
switch
(
$position
)
{
case
0
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# byte} other{# bytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} B'
,
$params
);
case
1
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# kilobyte} other{# kilobytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} KB'
,
$params
);
case
2
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# megabyte} other{# megabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} MB'
,
$params
);
case
3
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# gigabyte} other{# gigabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} GB'
,
$params
);
case
4
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# terabyte} other{# terabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} TB'
,
$params
);
default
:
return
$verbose
?
Yii
::
t
(
'yii'
,
'{n, plural, =1{# petabyte} other{# petabytes}}'
,
$params
)
:
Yii
::
t
(
'yii'
,
'{n} PB'
,
$params
);
}
}
/**
* Formats the value as the time interval between a date and now in human readable form.
* @param integer|string|DateTime|DateInterval $value the value to be formatted. The following
* types of value are supported:
*
* - an integer representing a UNIX timestamp
* - a string that can be parsed into a UNIX timestamp via `strtotime()` or that can be passed to a DateInterval constructor.
* - a PHP DateTime object
* - a PHP DateInterval object
*
* @return string the formatted result
*/
public
function
asRelativeTime
(
$value
,
$referenceTime
=
null
)
{
if
(
$value
===
null
)
{
return
$this
->
nullDisplay
;
}
if
(
$value
instanceof
\DateInterval
)
{
$interval
=
$value
;
}
else
{
$timestamp
=
$this
->
normalizeDatetimeValue
(
$value
);
if
(
$timestamp
===
false
)
{
// $value is not a valid date/time value, so we try
// to create a DateInterval with it
try
{
$interval
=
new
\DateInterval
(
$value
);
}
catch
(
Exception
$e
)
{
// invalid date/time and invalid interval
return
$this
->
nullDisplay
;
}
}
else
{
$timezone
=
new
\DateTimeZone
(
$this
->
timeZone
);
if
(
$referenceTime
===
null
)
{
$dateNow
=
new
DateTime
(
'now'
,
$timezone
);
}
else
{
$referenceTime
=
$this
->
normalizeDatetimeValue
(
$referenceTime
);
$dateNow
=
new
DateTime
(
null
,
$timezone
);
$dateNow
->
setTimestamp
(
$referenceTime
);
}
$dateThen
=
new
DateTime
(
null
,
$timezone
);
$dateThen
->
setTimestamp
(
$timestamp
);
$interval
=
$dateThen
->
diff
(
$dateNow
);
}
}
if
(
$interval
->
invert
)
{
if
(
$interval
->
y
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a year} other{# years}}'
,
[
'delta'
=>
$interval
->
y
]);
}
if
(
$interval
->
m
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a month} other{# months}}'
,
[
'delta'
=>
$interval
->
m
]);
}
if
(
$interval
->
d
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a day} other{# days}}'
,
[
'delta'
=>
$interval
->
d
]);
}
if
(
$interval
->
h
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{an hour} other{# hours}}'
,
[
'delta'
=>
$interval
->
h
]);
}
if
(
$interval
->
i
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a minute} other{# minutes}}'
,
[
'delta'
=>
$interval
->
i
]);
}
return
Yii
::
t
(
'yii'
,
'in {delta, plural, =1{a second} other{# seconds}}'
,
[
'delta'
=>
$interval
->
s
]);
}
else
{
if
(
$interval
->
y
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a year} other{# years}} ago'
,
[
'delta'
=>
$interval
->
y
]);
}
if
(
$interval
->
m
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a month} other{# months}} ago'
,
[
'delta'
=>
$interval
->
m
]);
}
if
(
$interval
->
d
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a day} other{# days}} ago'
,
[
'delta'
=>
$interval
->
d
]);
}
if
(
$interval
->
h
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{an hour} other{# hours}} ago'
,
[
'delta'
=>
$interval
->
h
]);
}
if
(
$interval
->
i
>=
1
)
{
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a minute} other{# minutes}} ago'
,
[
'delta'
=>
$interval
->
i
]);
}
return
Yii
::
t
(
'yii'
,
'{delta, plural, =1{a second} other{# seconds}} ago'
,
[
'delta'
=>
$interval
->
s
]);
}
}
}
tests/unit/framework/base/FormatterTest.php
View file @
91e4ad59
...
...
@@ -16,339 +16,339 @@ use DateInterval;
*/
class
FormatterTest
extends
TestCase
{
/**
* @var Formatter
*/
protected
$formatter
;
protected
function
setUp
()
{
parent
::
setUp
();
$this
->
mockApplication
();
$this
->
formatter
=
new
Formatter
();
}
protected
function
tearDown
()
{
parent
::
tearDown
();
$this
->
formatter
=
null
;
}
public
function
testAsRaw
()
{
$value
=
'123'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asRaw
(
$value
));
$value
=
123
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asRaw
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asRaw
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asRaw
(
null
));
}
public
function
testAsText
()
{
$value
=
'123'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asText
(
$value
));
$value
=
123
;
$this
->
assertSame
(
"
$value
"
,
$this
->
formatter
->
asText
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
'<>'
,
$this
->
formatter
->
asText
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asText
(
null
));
}
public
function
testAsNtext
()
{
$value
=
'123'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asNtext
(
$value
));
$value
=
123
;
$this
->
assertSame
(
"
$value
"
,
$this
->
formatter
->
asNtext
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
'<>'
,
$this
->
formatter
->
asNtext
(
$value
));
$value
=
"123
\n
456"
;
$this
->
assertSame
(
"123<br />
\n
456"
,
$this
->
formatter
->
asNtext
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asNtext
(
null
));
}
public
function
testAsParagraphs
()
{
$value
=
'123'
;
$this
->
assertSame
(
"<p>
$value
</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
123
;
$this
->
assertSame
(
"<p>
$value
</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
'<p><></p>'
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
"123
\n
456"
;
$this
->
assertSame
(
"<p>123
\n
456</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
"123
\n\n
456"
;
$this
->
assertSame
(
"<p>123</p>
\n
<p>456</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
"123
\n\n\n
456"
;
$this
->
assertSame
(
"<p>123</p>
\n
<p>456</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asParagraphs
(
null
));
}
public
function
testAsHtml
()
{
// todo: dependency on HtmlPurifier
}
public
function
testAsEmail
()
{
$value
=
'test@sample.com'
;
$this
->
assertSame
(
"<a href=
\"
mailto:
$value
\"
>
$value
</a>"
,
$this
->
formatter
->
asEmail
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asEmail
(
null
));
}
public
function
testAsImage
()
{
$value
=
'http://sample.com/img.jpg'
;
$this
->
assertSame
(
"<img src=
\"
$value
\"
alt=
\"\"
>"
,
$this
->
formatter
->
asImage
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asImage
(
null
));
}
public
function
testAsBoolean
()
{
$value
=
true
;
$this
->
assertSame
(
'Yes'
,
$this
->
formatter
->
asBoolean
(
$value
));
$value
=
false
;
$this
->
assertSame
(
'No'
,
$this
->
formatter
->
asBoolean
(
$value
));
$value
=
"111"
;
$this
->
assertSame
(
'Yes'
,
$this
->
formatter
->
asBoolean
(
$value
));
$value
=
""
;
$this
->
assertSame
(
'No'
,
$this
->
formatter
->
asBoolean
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asBoolean
(
null
));
}
public
function
testAsDate
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'Y/m/d'
,
$value
),
$this
->
formatter
->
asDate
(
$value
));
$this
->
assertSame
(
date
(
'Y-m-d'
,
$value
),
$this
->
formatter
->
asDate
(
$value
,
'Y-m-d'
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asDate
(
null
));
}
public
function
testAsTime
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'h:i:s A'
,
$value
),
$this
->
formatter
->
asTime
(
$value
));
$this
->
assertSame
(
date
(
'h:i:s'
,
$value
),
$this
->
formatter
->
asTime
(
$value
,
'h:i:s'
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asTime
(
null
));
}
public
function
testAsDatetime
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'Y/m/d h:i:s A'
,
$value
),
$this
->
formatter
->
asDatetime
(
$value
));
$this
->
assertSame
(
date
(
'Y-m-d h:i:s'
,
$value
),
$this
->
formatter
->
asDatetime
(
$value
,
'Y-m-d h:i:s'
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asDatetime
(
null
));
}
public
function
testAsInteger
()
{
$value
=
123
;
$this
->
assertSame
(
"
$value
"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
123.23
;
$this
->
assertSame
(
"123"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
'a'
;
$this
->
assertSame
(
"0"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
-
123.23
;
$this
->
assertSame
(
"-123"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
"-123abc"
;
$this
->
assertSame
(
"-123"
,
$this
->
formatter
->
asInteger
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asInteger
(
null
));
}
public
function
testAsDouble
()
{
$value
=
123.12
;
$this
->
assertSame
(
"123.12"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
assertSame
(
"123.1"
,
$this
->
formatter
->
asDouble
(
$value
,
1
));
$this
->
assertSame
(
"123"
,
$this
->
formatter
->
asDouble
(
$value
,
0
));
$value
=
123
;
$this
->
assertSame
(
"123.00"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
formatter
->
decimalSeparator
=
','
;
$value
=
123.12
;
$this
->
assertSame
(
"123,12"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
assertSame
(
"123,1"
,
$this
->
formatter
->
asDouble
(
$value
,
1
));
$this
->
assertSame
(
"123"
,
$this
->
formatter
->
asDouble
(
$value
,
0
));
$value
=
123123.123
;
$this
->
assertSame
(
"123123,12"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asDouble
(
null
));
}
public
function
testAsNumber
()
{
$value
=
123123.123
;
$this
->
assertSame
(
"123,123"
,
$this
->
formatter
->
asNumber
(
$value
));
$this
->
assertSame
(
"123,123.12"
,
$this
->
formatter
->
asNumber
(
$value
,
2
));
$this
->
formatter
->
decimalSeparator
=
','
;
$this
->
formatter
->
thousandSeparator
=
' '
;
$this
->
assertSame
(
"123 123"
,
$this
->
formatter
->
asNumber
(
$value
));
$this
->
assertSame
(
"123 123,12"
,
$this
->
formatter
->
asNumber
(
$value
,
2
));
$this
->
formatter
->
thousandSeparator
=
''
;
$this
->
assertSame
(
"123123"
,
$this
->
formatter
->
asNumber
(
$value
));
$this
->
assertSame
(
"123123,12"
,
$this
->
formatter
->
asNumber
(
$value
,
2
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asNumber
(
null
));
}
public
function
testFormat
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'Y/m/d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
'date'
));
$this
->
assertSame
(
date
(
'Y/m/d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
'DATE'
));
$this
->
assertSame
(
date
(
'Y-m-d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
[
'date'
,
'Y-m-d'
]));
$this
->
setExpectedException
(
'\yii\base\InvalidParamException'
);
$this
->
assertSame
(
date
(
'Y-m-d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
'data'
));
}
private
function
buildDateSubIntervals
(
$referenceDate
,
$intervals
)
{
$date
=
new
DateTime
(
$referenceDate
);
foreach
(
$intervals
as
$interval
)
{
$date
->
sub
(
$interval
);
}
return
$date
;
}
public
function
testAsRelativeTime
()
{
$interval_1_second
=
new
DateInterval
(
"PT1S"
);
$interval_244_seconds
=
new
DateInterval
(
"PT244S"
);
$interval_1_minute
=
new
DateInterval
(
"PT1M"
);
$interval_33_minutes
=
new
DateInterval
(
"PT33M"
);
$interval_1_hour
=
new
DateInterval
(
"PT1H"
);
$interval_6_hours
=
new
DateInterval
(
"PT6H"
);
$interval_1_day
=
new
DateInterval
(
"P1D"
);
$interval_89_days
=
new
DateInterval
(
"P89D"
);
$interval_1_month
=
new
DateInterval
(
"P1M"
);
$interval_5_months
=
new
DateInterval
(
"P5M"
);
$interval_1_year
=
new
DateInterval
(
"P1Y"
);
$interval_12_years
=
new
DateInterval
(
"P12Y"
);
// Pass a DateInterval
$this
->
assertSame
(
'a second ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_second
));
$this
->
assertSame
(
'244 seconds ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_244_seconds
));
$this
->
assertSame
(
'a minute ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_minute
));
$this
->
assertSame
(
'33 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_33_minutes
));
$this
->
assertSame
(
'an hour ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_hour
));
$this
->
assertSame
(
'6 hours ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_6_hours
));
$this
->
assertSame
(
'a day ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_day
));
$this
->
assertSame
(
'89 days ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_89_days
));
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_month
));
$this
->
assertSame
(
'5 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_5_months
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_year
));
$this
->
assertSame
(
'12 years ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_12_years
));
// Pass a DateInterval string
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'2007-03-01T13:00:00Z/2008-05-11T15:30:00Z'
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'2007-03-01T13:00:00Z/P1Y2M10DT2H30M'
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'P1Y2M10DT2H30M/2008-05-11T15:30:00Z'
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'P1Y2M10DT2H30M'
));
$this
->
assertSame
(
'94 months ago'
,
$this
->
formatter
->
asRelativeTime
(
'P94M'
));
// Force the reference time and pass a past DateTime
$dateNow
=
new
DateTime
(
'2014-03-13'
);
$this
->
assertSame
(
'a second ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_second
]),
$dateNow
));
$this
->
assertSame
(
'4 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_244_seconds
]),
$dateNow
));
$this
->
assertSame
(
'a minute ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_minute
]),
$dateNow
));
$this
->
assertSame
(
'33 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_33_minutes
]),
$dateNow
));
$this
->
assertSame
(
'an hour ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_hour
]),
$dateNow
));
$this
->
assertSame
(
'6 hours ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_6_hours
]),
$dateNow
));
$this
->
assertSame
(
'a day ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_day
]),
$dateNow
));
$this
->
assertSame
(
'2 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_89_days
]),
$dateNow
));
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'5 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_5_months
]),
$dateNow
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_year
]),
$dateNow
));
$this
->
assertSame
(
'12 years ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_12_years
]),
$dateNow
));
// Tricky 31-days month stuff
// See: http://www.gnu.org/software/tar/manual/html_section/Relative-items-in-date-strings.html
$dateNow
=
new
DateTime
(
'2014-03-31'
);
$dateThen
=
new
DateTime
(
'2014-03-03'
);
$this
->
assertSame
(
'28 days ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-31'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'28 days ago'
,
$this
->
formatter
->
asRelativeTime
(
$dateThen
,
$dateNow
));
$dateThen
=
new
DateTime
(
'2014-02-28'
);
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$dateThen
,
$dateNow
));
// Relative to current time tests (can't test with seconds though
)
$this
->
assertSame
(
'4 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_244_seconds
])));
$this
->
assertSame
(
'a minute ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_minute
])));
$this
->
assertSame
(
'33 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_33_minutes
])));
$this
->
assertSame
(
'an hour ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_hour
])));
$this
->
assertSame
(
'6 hours ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_6_hours
])));
$this
->
assertSame
(
'a day ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_day
])));
$this
->
assertSame
(
'2 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_89_days
])));
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_month
])));
$this
->
assertSame
(
'5 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_5_months
])));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_year
])));
$this
->
assertSame
(
'12 years ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_12_years
])));
// Invert all the DateIntervals
$interval_1_second
->
invert
=
true
;
$interval_244_seconds
->
invert
=
true
;
$interval_1_minute
->
invert
=
true
;
$interval_33_minutes
->
invert
=
true
;
$interval_1_hour
->
invert
=
true
;
$interval_6_hours
->
invert
=
true
;
$interval_1_day
->
invert
=
true
;
$interval_89_days
->
invert
=
true
;
$interval_1_month
->
invert
=
true
;
$interval_5_months
->
invert
=
true
;
$interval_1_year
->
invert
=
true
;
$interval_12_years
->
invert
=
true
;
// Pass a inverted DateInterval
$this
->
assertSame
(
'in a second'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_second
));
$this
->
assertSame
(
'in 244 seconds'
,
$this
->
formatter
->
asRelativeTime
(
$interval_244_seconds
));
$this
->
assertSame
(
'in a minute'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_minute
));
$this
->
assertSame
(
'in 33 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$interval_33_minutes
));
$this
->
assertSame
(
'in an hour'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_hour
));
$this
->
assertSame
(
'in 6 hours'
,
$this
->
formatter
->
asRelativeTime
(
$interval_6_hours
));
$this
->
assertSame
(
'in a day'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_day
));
$this
->
assertSame
(
'in 89 days'
,
$this
->
formatter
->
asRelativeTime
(
$interval_89_days
));
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_month
));
$this
->
assertSame
(
'in 5 months'
,
$this
->
formatter
->
asRelativeTime
(
$interval_5_months
));
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_year
));
$this
->
assertSame
(
'in 12 years'
,
$this
->
formatter
->
asRelativeTime
(
$interval_12_years
));
// Pass a inverted DateInterval string
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
'2008-05-11T15:30:00Z/2007-03-01T13:00:00Z'
));
// Force the reference time and pass a future DateTime
$dateNow
=
new
DateTime
(
'2014-03-13'
);
$this
->
assertSame
(
'in a second'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_second
]),
$dateNow
));
$this
->
assertSame
(
'in 4 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_244_seconds
]),
$dateNow
));
$this
->
assertSame
(
'in a minute'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_minute
]),
$dateNow
));
$this
->
assertSame
(
'in 33 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_33_minutes
]),
$dateNow
));
$this
->
assertSame
(
'in an hour'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_hour
]),
$dateNow
));
$this
->
assertSame
(
'in 6 hours'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_6_hours
]),
$dateNow
));
$this
->
assertSame
(
'in a day'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_day
]),
$dateNow
));
$this
->
assertSame
(
'in 2 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_89_days
]),
$dateNow
));
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'in 5 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_5_months
]),
$dateNow
));
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_year
]),
$dateNow
));
$this
->
assertSame
(
'in 12 years'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_12_years
]),
$dateNow
));
// Tricky 31-days month stuff
// See: http://www.gnu.org/software/tar/manual/html_section/Relative-items-in-date-strings.html
$dateNow
=
new
DateTime
(
'2014-03-03'
);
$dateThen
=
new
DateTime
(
'2014-03-31'
);
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-03'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'in 28 days'
,
$this
->
formatter
->
asRelativeTime
(
$dateThen
,
$dateNow
));
// Relative to current time tests (can't test with seconds though
)
// We add 5 seconds to compensate for tests computation time
$interval_5_seconds
=
new
DateInterval
(
'PT5S'
);
$interval_5_seconds
->
invert
=
true
;
$this
->
assertSame
(
'in 4 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_244_seconds
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a minute'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_minute
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 33 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_33_minutes
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in an hour'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_hour
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 6 hours'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_6_hours
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a day'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_day
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 2 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_89_days
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_month
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 5 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_5_months
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_year
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 12 years'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_12_years
,
$interval_5_seconds
])));
}
/**
* @var Formatter
*/
protected
$formatter
;
protected
function
setUp
()
{
parent
::
setUp
();
$this
->
mockApplication
();
$this
->
formatter
=
new
Formatter
();
}
protected
function
tearDown
()
{
parent
::
tearDown
();
$this
->
formatter
=
null
;
}
public
function
testAsRaw
()
{
$value
=
'123'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asRaw
(
$value
));
$value
=
123
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asRaw
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asRaw
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asRaw
(
null
));
}
public
function
testAsText
()
{
$value
=
'123'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asText
(
$value
));
$value
=
123
;
$this
->
assertSame
(
"
$value
"
,
$this
->
formatter
->
asText
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
'<>'
,
$this
->
formatter
->
asText
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asText
(
null
));
}
public
function
testAsNtext
()
{
$value
=
'123'
;
$this
->
assertSame
(
$value
,
$this
->
formatter
->
asNtext
(
$value
));
$value
=
123
;
$this
->
assertSame
(
"
$value
"
,
$this
->
formatter
->
asNtext
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
'<>'
,
$this
->
formatter
->
asNtext
(
$value
));
$value
=
"123
\n
456"
;
$this
->
assertSame
(
"123<br />
\n
456"
,
$this
->
formatter
->
asNtext
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asNtext
(
null
));
}
public
function
testAsParagraphs
()
{
$value
=
'123'
;
$this
->
assertSame
(
"<p>
$value
</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
123
;
$this
->
assertSame
(
"<p>
$value
</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
'<>'
;
$this
->
assertSame
(
'<p><></p>'
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
"123
\n
456"
;
$this
->
assertSame
(
"<p>123
\n
456</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
"123
\n\n
456"
;
$this
->
assertSame
(
"<p>123</p>
\n
<p>456</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$value
=
"123
\n\n\n
456"
;
$this
->
assertSame
(
"<p>123</p>
\n
<p>456</p>"
,
$this
->
formatter
->
asParagraphs
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asParagraphs
(
null
));
}
public
function
testAsHtml
()
{
// todo: dependency on HtmlPurifier
}
public
function
testAsEmail
()
{
$value
=
'test@sample.com'
;
$this
->
assertSame
(
"<a href=
\"
mailto:
$value
\"
>
$value
</a>"
,
$this
->
formatter
->
asEmail
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asEmail
(
null
));
}
public
function
testAsImage
()
{
$value
=
'http://sample.com/img.jpg'
;
$this
->
assertSame
(
"<img src=
\"
$value
\"
alt=
\"\"
>"
,
$this
->
formatter
->
asImage
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asImage
(
null
));
}
public
function
testAsBoolean
()
{
$value
=
true
;
$this
->
assertSame
(
'Yes'
,
$this
->
formatter
->
asBoolean
(
$value
));
$value
=
false
;
$this
->
assertSame
(
'No'
,
$this
->
formatter
->
asBoolean
(
$value
));
$value
=
"111"
;
$this
->
assertSame
(
'Yes'
,
$this
->
formatter
->
asBoolean
(
$value
));
$value
=
""
;
$this
->
assertSame
(
'No'
,
$this
->
formatter
->
asBoolean
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asBoolean
(
null
));
}
public
function
testAsDate
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'Y/m/d'
,
$value
),
$this
->
formatter
->
asDate
(
$value
));
$this
->
assertSame
(
date
(
'Y-m-d'
,
$value
),
$this
->
formatter
->
asDate
(
$value
,
'Y-m-d'
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asDate
(
null
));
}
public
function
testAsTime
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'h:i:s A'
,
$value
),
$this
->
formatter
->
asTime
(
$value
));
$this
->
assertSame
(
date
(
'h:i:s'
,
$value
),
$this
->
formatter
->
asTime
(
$value
,
'h:i:s'
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asTime
(
null
));
}
public
function
testAsDatetime
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'Y/m/d h:i:s A'
,
$value
),
$this
->
formatter
->
asDatetime
(
$value
));
$this
->
assertSame
(
date
(
'Y-m-d h:i:s'
,
$value
),
$this
->
formatter
->
asDatetime
(
$value
,
'Y-m-d h:i:s'
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asDatetime
(
null
));
}
public
function
testAsInteger
()
{
$value
=
123
;
$this
->
assertSame
(
"
$value
"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
123.23
;
$this
->
assertSame
(
"123"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
'a'
;
$this
->
assertSame
(
"0"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
-
123.23
;
$this
->
assertSame
(
"-123"
,
$this
->
formatter
->
asInteger
(
$value
));
$value
=
"-123abc"
;
$this
->
assertSame
(
"-123"
,
$this
->
formatter
->
asInteger
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asInteger
(
null
));
}
public
function
testAsDouble
()
{
$value
=
123.12
;
$this
->
assertSame
(
"123.12"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
assertSame
(
"123.1"
,
$this
->
formatter
->
asDouble
(
$value
,
1
));
$this
->
assertSame
(
"123"
,
$this
->
formatter
->
asDouble
(
$value
,
0
));
$value
=
123
;
$this
->
assertSame
(
"123.00"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
formatter
->
decimalSeparator
=
','
;
$value
=
123.12
;
$this
->
assertSame
(
"123,12"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
assertSame
(
"123,1"
,
$this
->
formatter
->
asDouble
(
$value
,
1
));
$this
->
assertSame
(
"123"
,
$this
->
formatter
->
asDouble
(
$value
,
0
));
$value
=
123123.123
;
$this
->
assertSame
(
"123123,12"
,
$this
->
formatter
->
asDouble
(
$value
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asDouble
(
null
));
}
public
function
testAsNumber
()
{
$value
=
123123.123
;
$this
->
assertSame
(
"123,123"
,
$this
->
formatter
->
asNumber
(
$value
));
$this
->
assertSame
(
"123,123.12"
,
$this
->
formatter
->
asNumber
(
$value
,
2
));
$this
->
formatter
->
decimalSeparator
=
','
;
$this
->
formatter
->
thousandSeparator
=
' '
;
$this
->
assertSame
(
"123 123"
,
$this
->
formatter
->
asNumber
(
$value
));
$this
->
assertSame
(
"123 123,12"
,
$this
->
formatter
->
asNumber
(
$value
,
2
));
$this
->
formatter
->
thousandSeparator
=
''
;
$this
->
assertSame
(
"123123"
,
$this
->
formatter
->
asNumber
(
$value
));
$this
->
assertSame
(
"123123,12"
,
$this
->
formatter
->
asNumber
(
$value
,
2
));
$this
->
assertSame
(
$this
->
formatter
->
nullDisplay
,
$this
->
formatter
->
asNumber
(
null
));
}
public
function
testFormat
()
{
$value
=
time
();
$this
->
assertSame
(
date
(
'Y/m/d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
'date'
));
$this
->
assertSame
(
date
(
'Y/m/d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
'DATE'
));
$this
->
assertSame
(
date
(
'Y-m-d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
[
'date'
,
'Y-m-d'
]));
$this
->
setExpectedException
(
'\yii\base\InvalidParamException'
);
$this
->
assertSame
(
date
(
'Y-m-d'
,
$value
),
$this
->
formatter
->
format
(
$value
,
'data'
));
}
private
function
buildDateSubIntervals
(
$referenceDate
,
$intervals
)
{
$date
=
new
DateTime
(
$referenceDate
);
foreach
(
$intervals
as
$interval
)
{
$date
->
sub
(
$interval
);
}
return
$date
;
}
public
function
testAsRelativeTime
()
{
$interval_1_second
=
new
DateInterval
(
"PT1S"
);
$interval_244_seconds
=
new
DateInterval
(
"PT244S"
);
$interval_1_minute
=
new
DateInterval
(
"PT1M"
);
$interval_33_minutes
=
new
DateInterval
(
"PT33M"
);
$interval_1_hour
=
new
DateInterval
(
"PT1H"
);
$interval_6_hours
=
new
DateInterval
(
"PT6H"
);
$interval_1_day
=
new
DateInterval
(
"P1D"
);
$interval_89_days
=
new
DateInterval
(
"P89D"
);
$interval_1_month
=
new
DateInterval
(
"P1M"
);
$interval_5_months
=
new
DateInterval
(
"P5M"
);
$interval_1_year
=
new
DateInterval
(
"P1Y"
);
$interval_12_years
=
new
DateInterval
(
"P12Y"
);
// Pass a DateInterval
$this
->
assertSame
(
'a second ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_second
));
$this
->
assertSame
(
'244 seconds ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_244_seconds
));
$this
->
assertSame
(
'a minute ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_minute
));
$this
->
assertSame
(
'33 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_33_minutes
));
$this
->
assertSame
(
'an hour ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_hour
));
$this
->
assertSame
(
'6 hours ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_6_hours
));
$this
->
assertSame
(
'a day ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_day
));
$this
->
assertSame
(
'89 days ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_89_days
));
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_month
));
$this
->
assertSame
(
'5 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_5_months
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_year
));
$this
->
assertSame
(
'12 years ago'
,
$this
->
formatter
->
asRelativeTime
(
$interval_12_years
));
// Pass a DateInterval string
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'2007-03-01T13:00:00Z/2008-05-11T15:30:00Z'
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'2007-03-01T13:00:00Z/P1Y2M10DT2H30M'
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'P1Y2M10DT2H30M/2008-05-11T15:30:00Z'
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
'P1Y2M10DT2H30M'
));
$this
->
assertSame
(
'94 months ago'
,
$this
->
formatter
->
asRelativeTime
(
'P94M'
));
// Force the reference time and pass a past DateTime
$dateNow
=
new
DateTime
(
'2014-03-13'
);
$this
->
assertSame
(
'a second ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_second
]),
$dateNow
));
$this
->
assertSame
(
'4 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_244_seconds
]),
$dateNow
));
$this
->
assertSame
(
'a minute ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_minute
]),
$dateNow
));
$this
->
assertSame
(
'33 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_33_minutes
]),
$dateNow
));
$this
->
assertSame
(
'an hour ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_hour
]),
$dateNow
));
$this
->
assertSame
(
'6 hours ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_6_hours
]),
$dateNow
));
$this
->
assertSame
(
'a day ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_day
]),
$dateNow
));
$this
->
assertSame
(
'2 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_89_days
]),
$dateNow
));
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'5 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_5_months
]),
$dateNow
));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_year
]),
$dateNow
));
$this
->
assertSame
(
'12 years ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_12_years
]),
$dateNow
));
// Tricky 31-days month stuff
// See: http://www.gnu.org/software/tar/manual/html_section/Relative-items-in-date-strings.html
$dateNow
=
new
DateTime
(
'2014-03-31'
);
$dateThen
=
new
DateTime
(
'2014-03-03'
);
$this
->
assertSame
(
'28 days ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-31'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'28 days ago'
,
$this
->
formatter
->
asRelativeTime
(
$dateThen
,
$dateNow
));
$dateThen
=
new
DateTime
(
'2014-02-28'
);
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$dateThen
,
$dateNow
));
// Relative to current time tests (can't test with seconds though due to the tests computation time
)
$this
->
assertSame
(
'4 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_244_seconds
])));
$this
->
assertSame
(
'a minute ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_minute
])));
$this
->
assertSame
(
'33 minutes ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_33_minutes
])));
$this
->
assertSame
(
'an hour ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_hour
])));
$this
->
assertSame
(
'6 hours ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_6_hours
])));
$this
->
assertSame
(
'a day ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_day
])));
$this
->
assertSame
(
'2 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_89_days
])));
$this
->
assertSame
(
'a month ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_month
])));
$this
->
assertSame
(
'5 months ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_5_months
])));
$this
->
assertSame
(
'a year ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_year
])));
$this
->
assertSame
(
'12 years ago'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_12_years
])));
// Invert all the DateIntervals
$interval_1_second
->
invert
=
true
;
$interval_244_seconds
->
invert
=
true
;
$interval_1_minute
->
invert
=
true
;
$interval_33_minutes
->
invert
=
true
;
$interval_1_hour
->
invert
=
true
;
$interval_6_hours
->
invert
=
true
;
$interval_1_day
->
invert
=
true
;
$interval_89_days
->
invert
=
true
;
$interval_1_month
->
invert
=
true
;
$interval_5_months
->
invert
=
true
;
$interval_1_year
->
invert
=
true
;
$interval_12_years
->
invert
=
true
;
// Pass a inverted DateInterval
$this
->
assertSame
(
'in a second'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_second
));
$this
->
assertSame
(
'in 244 seconds'
,
$this
->
formatter
->
asRelativeTime
(
$interval_244_seconds
));
$this
->
assertSame
(
'in a minute'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_minute
));
$this
->
assertSame
(
'in 33 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$interval_33_minutes
));
$this
->
assertSame
(
'in an hour'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_hour
));
$this
->
assertSame
(
'in 6 hours'
,
$this
->
formatter
->
asRelativeTime
(
$interval_6_hours
));
$this
->
assertSame
(
'in a day'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_day
));
$this
->
assertSame
(
'in 89 days'
,
$this
->
formatter
->
asRelativeTime
(
$interval_89_days
));
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_month
));
$this
->
assertSame
(
'in 5 months'
,
$this
->
formatter
->
asRelativeTime
(
$interval_5_months
));
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
$interval_1_year
));
$this
->
assertSame
(
'in 12 years'
,
$this
->
formatter
->
asRelativeTime
(
$interval_12_years
));
// Pass a inverted DateInterval string
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
'2008-05-11T15:30:00Z/2007-03-01T13:00:00Z'
));
// Force the reference time and pass a future DateTime
$dateNow
=
new
DateTime
(
'2014-03-13'
);
$this
->
assertSame
(
'in a second'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_second
]),
$dateNow
));
$this
->
assertSame
(
'in 4 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_244_seconds
]),
$dateNow
));
$this
->
assertSame
(
'in a minute'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_minute
]),
$dateNow
));
$this
->
assertSame
(
'in 33 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_33_minutes
]),
$dateNow
));
$this
->
assertSame
(
'in an hour'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_hour
]),
$dateNow
));
$this
->
assertSame
(
'in 6 hours'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_6_hours
]),
$dateNow
));
$this
->
assertSame
(
'in a day'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_day
]),
$dateNow
));
$this
->
assertSame
(
'in 2 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_89_days
]),
$dateNow
));
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'in 5 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_5_months
]),
$dateNow
));
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_1_year
]),
$dateNow
));
$this
->
assertSame
(
'in 12 years'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-13'
,
[
$interval_12_years
]),
$dateNow
));
// Tricky 31-days month stuff
// See: http://www.gnu.org/software/tar/manual/html_section/Relative-items-in-date-strings.html
$dateNow
=
new
DateTime
(
'2014-03-03'
);
$dateThen
=
new
DateTime
(
'2014-03-31'
);
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'2014-03-03'
,
[
$interval_1_month
]),
$dateNow
));
$this
->
assertSame
(
'in 28 days'
,
$this
->
formatter
->
asRelativeTime
(
$dateThen
,
$dateNow
));
// Relative to current time tests (can't test with seconds though due to the tests computation time
)
// We add 5 seconds to compensate for tests computation time
$interval_5_seconds
=
new
DateInterval
(
'PT5S'
);
$interval_5_seconds
->
invert
=
true
;
$this
->
assertSame
(
'in 4 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_244_seconds
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a minute'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_minute
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 33 minutes'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_33_minutes
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in an hour'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_hour
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 6 hours'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_6_hours
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a day'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_day
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 2 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_89_days
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a month'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_month
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 5 months'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_5_months
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in a year'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_1_year
,
$interval_5_seconds
])));
$this
->
assertSame
(
'in 12 years'
,
$this
->
formatter
->
asRelativeTime
(
$this
->
buildDateSubIntervals
(
'now'
,
[
$interval_12_years
,
$interval_5_seconds
])));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment