Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
project
drupal
Commits
4e902066
Commit
4e902066
authored
Dec 02, 2014
by
alexpott
Browse files
Issue
#2382011
by Mile23: Expand unit testing for Drupal\Component\Utility\UserAgent
parent
22d18168
Changes
2
Hide whitespace changes
Inline
Side-by-side
core/modules/language/src/Tests/LanguageBrowserDetectionUnitTest.php
View file @
4e902066
...
...
@@ -21,141 +21,6 @@ class LanguageBrowserDetectionUnitTest extends WebTestBase {
public
static
$modules
=
array
(
'language'
);
/**
* Unit tests for the language_from_browser() function.
*
* @see language_from_browser().
*/
function
testLanguageFromBrowser
()
{
// The order of the languages is only important if the browser language
// codes are having the same qvalue, otherwise the one with the highest
// qvalue is preferred. The automatically generated generic tags are always
// having a lower qvalue.
$languages
=
array
(
// In our test case, 'en' has priority over 'en-US'.
'en'
=>
new
Language
(
array
(
'id'
=>
'en'
,
)),
'en-US'
=>
new
Language
(
array
(
'id'
=>
'en-US'
,
)),
// But 'fr-CA' has priority over 'fr'.
'fr-CA'
=>
new
Language
(
array
(
'id'
=>
'fr-CA'
,
)),
'fr'
=>
new
Language
(
array
(
'id'
=>
'fr'
,
)),
// 'es-MX' is alone.
'es-MX'
=>
new
Language
(
array
(
'id'
=>
'es-MX'
,
)),
// 'pt' is alone.
'pt'
=>
new
Language
(
array
(
'id'
=>
'pt'
,
)),
// Language codes with more then one dash are actually valid.
// eh-oh-laa-laa is the official language code of the Teletubbies.
'eh-oh-laa-laa'
=>
new
Language
(
array
(
'id'
=>
'eh-oh-laa-laa'
,
)),
// Chinese languages.
'zh-hans'
=>
new
Language
(
array
(
'id'
=>
'zh-hans'
,
)),
'zh-hant'
=>
new
Language
(
array
(
'id'
=>
'zh-hant'
,
)),
'zh-hant-tw'
=>
new
Language
(
array
(
'id'
=>
'zh-hant'
,
)),
);
$test_cases
=
array
(
// Equal qvalue for each language, choose the site preferred one.
'en,en-US,fr-CA,fr,es-MX'
=>
'en'
,
'en-US,en,fr-CA,fr,es-MX'
=>
'en'
,
'fr,en'
=>
'en'
,
'en,fr'
=>
'en'
,
'en-US,fr'
=>
'en-US'
,
'fr,en-US'
=>
'en-US'
,
'fr,fr-CA'
=>
'fr-CA'
,
'fr-CA,fr'
=>
'fr-CA'
,
'fr'
=>
'fr-CA'
,
'fr;q=1'
=>
'fr-CA'
,
'fr,es-MX'
=>
'fr-CA'
,
'fr,es'
=>
'fr-CA'
,
'es,fr'
=>
'fr-CA'
,
'es-MX,de'
=>
'es-MX'
,
'de,es-MX'
=>
'es-MX'
,
// Different cases and whitespace.
'en'
=>
'en'
,
'En'
=>
'en'
,
'EN'
=>
'en'
,
' en'
=>
'en'
,
'en '
=>
'en'
,
'en, fr'
=>
'en'
,
// A less specific language from the browser matches a more specific one
// from the website, and the other way around for compatibility with
// some versions of Internet Explorer.
'es'
=>
'es-MX'
,
'es-MX'
=>
'es-MX'
,
'pt'
=>
'pt'
,
'pt-PT'
=>
'pt'
,
'pt-PT;q=0.5,pt-BR;q=1,en;q=0.7'
=>
'en'
,
'pt-PT;q=1,pt-BR;q=0.5,en;q=0.7'
=>
'en'
,
'pt-PT;q=0.4,pt-BR;q=0.1,en;q=0.7'
=>
'en'
,
'pt-PT;q=0.1,pt-BR;q=0.4,en;q=0.7'
=>
'en'
,
// Language code with several dashes are valid. The less specific language
// from the browser matches the more specific one from the website.
'eh-oh-laa-laa'
=>
'eh-oh-laa-laa'
,
'eh-oh-laa'
=>
'eh-oh-laa-laa'
,
'eh-oh'
=>
'eh-oh-laa-laa'
,
'eh'
=>
'eh-oh-laa-laa'
,
// Different qvalues.
'fr,en;q=0.5'
=>
'fr-CA'
,
'fr,en;q=0.5,fr-CA;q=0.25'
=>
'fr'
,
// Silly wildcards are also valid.
'*,fr-CA;q=0.5'
=>
'en'
,
'*,en;q=0.25'
=>
'fr-CA'
,
'en,en-US;q=0.5,fr;q=0.25'
=>
'en'
,
'en-US,en;q=0.5,fr;q=0.25'
=>
'en-US'
,
// Unresolvable cases.
''
=>
FALSE
,
'de,pl'
=>
FALSE
,
'iecRswK4eh'
=>
FALSE
,
$this
->
randomMachineName
(
10
)
=>
FALSE
,
// Chinese langcodes.
'zh-cn, en-us;q=0.90, en;q=0.80, zh;q=0.70'
=>
'zh-hans'
,
'zh-tw, en-us;q=0.90, en;q=0.80, zh;q=0.70'
=>
'zh-hant'
,
'zh-hant, en-us;q=0.90, en;q=0.80, zh;q=0.70'
=>
'zh-hant'
,
'zh-hans, en-us;q=0.90, en;q=0.80, zh;q=0.70'
=>
'zh-hans'
,
'zh-cn'
=>
'zh-hans'
,
'zh-sg'
=>
'zh-hans'
,
'zh-tw'
=>
'zh-hant'
,
'zh-hk'
=>
'zh-hant'
,
'zh-mo'
=>
'zh-hant'
,
'zh-hans'
=>
'zh-hans'
,
'zh-hant'
=>
'zh-hant'
,
'zh-chs'
=>
'zh-hans'
,
'zh-cht'
=>
'zh-hant'
,
);
$mappings
=
$this
->
container
->
get
(
'config.factory'
)
->
get
(
'language.mappings'
)
->
get
();
foreach
(
$test_cases
as
$accept_language
=>
$expected_result
)
{
$result
=
UserAgent
::
getBestMatchingLangcode
(
$accept_language
,
array_keys
(
$languages
),
$mappings
);
$this
->
assertIdentical
(
$result
,
$expected_result
,
format_string
(
"Language selection '@accept-language' selects '@result', result = '@actual'"
,
array
(
'@accept-language'
=>
$accept_language
,
'@result'
=>
$expected_result
,
'@actual'
=>
isset
(
$result
)
?
$result
:
'none'
)));
}
}
/**
* Tests for adding, editing and deleting mappings between browser language
* codes and Drupal language codes.
...
...
core/tests/Drupal/Tests/Component/Utility/UserAgentTest.php
0 → 100644
View file @
4e902066
<?php
/**
* @file
* Container Drupal\Tests\Component\Utility\UserAgentTest.
*/
namespace
Drupal\Tests\Component\Utility
;
use
Drupal\Component\Utility\UserAgent
;
use
Drupal\Tests\UnitTestCase
;
/**
* Tests bytes size parsing helper methods.
*
* @group Utility
*
* @coversDefaultClass \Drupal\Component\Utility\UserAgent
*/
class
UserAgentTest
extends
UnitTestCase
{
/**
* Helper method to supply language codes to testGetBestMatchingLangcode().
*
* @return array
* Language codes, ordered by priority.
*/
protected
function
getLanguages
()
{
return
array
(
// In our test case, 'en' has priority over 'en-US'.
'en'
,
'en-US'
,
// But 'fr-CA' has priority over 'fr'.
'fr-CA'
,
'fr'
,
// 'es-MX' is alone.
'es-MX'
,
// 'pt' is alone.
'pt'
,
// Language codes with more then one dash are actually valid.
// eh-oh-laa-laa is the official language code of the Teletubbies.
'eh-oh-laa-laa'
,
// Chinese languages.
'zh-hans'
,
'zh-hant'
,
'zh-hant-tw'
,
);
}
/**
* Helper method to supply language mappings to testGetBestMatchingLangcode().
*
* @return array
* Language mappings.
*/
protected
function
getMappings
()
{
return
array
(
'no'
=>
'nb'
,
'pt'
=>
'pt-pt'
,
'zh'
=>
'zh-hans'
,
'zh-tw'
=>
'zh-hant'
,
'zh-hk'
=>
'zh-hant'
,
'zh-mo'
=>
'zh-hant'
,
'zh-cht'
=>
'zh-hant'
,
'zh-cn'
=>
'zh-hans'
,
'zh-sg'
=>
'zh-hans'
,
'zh-chs'
=>
'zh-hans'
,
);
}
/**
* Test matching language from user agent.
*
* @dataProvider providerTestGetBestMatchingLangcode
* @covers ::getBestMatchingLangcode
*/
public
function
testGetBestMatchingLangcode
(
$accept_language
,
$expected
)
{
$result
=
UserAgent
::
getBestMatchingLangcode
(
$accept_language
,
$this
->
getLanguages
(),
$this
->
getMappings
());
$this
->
assertSame
(
$expected
,
$result
);
}
/**
* Data provider for testGetBestMatchingLangcode().
*
* @return array
* - An accept-language string.
* - Expected best matching language code.
*/
public
function
providerTestGetBestMatchingLangcode
()
{
return
array
(
// Equal qvalue for each language, choose the site preferred one.
array
(
'en,en-US,fr-CA,fr,es-MX'
,
'en'
),
array
(
'en-US,en,fr-CA,fr,es-MX'
,
'en'
),
array
(
'fr,en'
,
'en'
),
array
(
'en,fr'
,
'en'
),
array
(
'en-US,fr'
,
'en-US'
),
array
(
'fr,en-US'
,
'en-US'
),
array
(
'fr,fr-CA'
,
'fr-CA'
),
array
(
'fr-CA,fr'
,
'fr-CA'
),
array
(
'fr'
,
'fr-CA'
),
array
(
'fr;q=1'
,
'fr-CA'
),
array
(
'fr,es-MX'
,
'fr-CA'
),
array
(
'fr,es'
,
'fr-CA'
),
array
(
'es,fr'
,
'fr-CA'
),
array
(
'es-MX,de'
,
'es-MX'
),
array
(
'de,es-MX'
,
'es-MX'
),
// Different cases and whitespace.
array
(
'en'
,
'en'
),
array
(
'En'
,
'en'
),
array
(
'EN'
,
'en'
),
array
(
' en'
,
'en'
),
array
(
'en '
,
'en'
),
array
(
'en, fr'
,
'en'
),
// A less specific language from the browser matches a more specific one
// from the website, and the other way around for compatibility with
// some versions of Internet Explorer.
array
(
'es'
,
'es-MX'
),
array
(
'es-MX'
,
'es-MX'
),
array
(
'pt'
,
'pt'
),
array
(
'pt-PT'
,
'pt'
),
array
(
'pt-PT;q=0.5,pt-BR;q=1,en;q=0.7'
,
'en'
),
array
(
'pt-PT;q=1,pt-BR;q=0.5,en;q=0.7'
,
'en'
),
array
(
'pt-PT;q=0.4,pt-BR;q=0.1,en;q=0.7'
,
'en'
),
array
(
'pt-PT;q=0.1,pt-BR;q=0.4,en;q=0.7'
,
'en'
),
// Language code with several dashes are valid. The less specific language
// from the browser matches the more specific one from the website.
array
(
'eh-oh-laa-laa'
,
'eh-oh-laa-laa'
),
array
(
'eh-oh-laa'
,
'eh-oh-laa-laa'
),
array
(
'eh-oh'
,
'eh-oh-laa-laa'
),
array
(
'eh'
,
'eh-oh-laa-laa'
),
// Different qvalues.
array
(
'fr,en;q=0.5'
,
'fr-CA'
),
array
(
'fr,en;q=0.5,fr-CA;q=0.25'
,
'fr'
),
// Silly wildcards are also valid.
array
(
'*,fr-CA;q=0.5'
,
'en'
),
array
(
'*,en;q=0.25'
,
'fr-CA'
),
array
(
'en,en-US;q=0.5,fr;q=0.25'
,
'en'
),
array
(
'en-US,en;q=0.5,fr;q=0.25'
,
'en-US'
),
// Unresolvable cases.
array
(
''
,
FALSE
),
array
(
'de,pl'
,
FALSE
),
array
(
'iecRswK4eh'
,
FALSE
),
array
(
$this
->
randomMachineName
(
10
),
FALSE
),
// Chinese langcodes.
array
(
'zh-cn, en-us;q=0.90, en;q=0.80, zh;q=0.70'
,
'zh-hans'
),
array
(
'zh-tw, en-us;q=0.90, en;q=0.80, zh;q=0.70'
,
'zh-hant'
),
array
(
'zh-hant, en-us;q=0.90, en;q=0.80, zh;q=0.70'
,
'zh-hant'
),
array
(
'zh-hans, en-us;q=0.90, en;q=0.80, zh;q=0.70'
,
'zh-hans'
),
// @todo: This is copied from RFC4647 but our regex skips the numbers so
// they where removed. Our code should be updated so private1-private2 is
// valid. http://tools.ietf.org/html/rfc4647#section-3.4
array
(
'zh-hant-CN-x-private-private, en-us;q=0.90, en;q=0.80, zh;q=0.70'
,
'zh-hant'
),
array
(
'zh-cn'
,
'zh-hans'
),
array
(
'zh-sg'
,
'zh-hans'
),
array
(
'zh-tw'
,
'zh-hant'
),
array
(
'zh-hk'
,
'zh-hant'
),
array
(
'zh-mo'
,
'zh-hant'
),
array
(
'zh-hans'
,
'zh-hans'
),
array
(
'zh-hant'
,
'zh-hant'
),
array
(
'zh-chs'
,
'zh-hans'
),
array
(
'zh-cht'
,
'zh-hant'
),
);
}
}
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