'Unicode handling', 'description' => 'Tests Drupal Unicode handling.', 'group' => 'System', ); } /** * Test full unicode features implemented using the mbstring extension. */ function testMbStringUnicode() { global $multibyte; // mbstring was not detected on this installation, there is no way to test // multibyte features. Treat that as an exception. if ($multibyte == UNICODE_SINGLEBYTE) { $this->error(t('Unable to test Multibyte features: mbstring extension was not detected.')); } $multibyte = UNICODE_MULTIBYTE; $this->extendedMode = TRUE; $this->pass(t('Testing in mbstring mode')); $this->helperTestStrToLower(); $this->helperTestStrToUpper(); $this->helperTestUcFirst(); $this->helperTestStrLen(); $this->helperTestSubStr(); $this->helperTestTruncate(); } /** * Test emulated unicode features. */ function testEmulatedUnicode() { global $multibyte; $multibyte = UNICODE_SINGLEBYTE; $this->extendedMode = FALSE; $this->pass(t('Testing in emulated (best-effort) mode')); $this->helperTestStrToLower(); $this->helperTestStrToUpper(); $this->helperTestUcFirst(); $this->helperTestStrLen(); $this->helperTestSubStr(); $this->helperTestTruncate(); } function helperTestStrToLower() { $testcase = array( 'tHe QUIcK bRoWn' => 'the quick brown', 'FrançAIS is ÜBER-åwesome' => 'français is über-åwesome', ); if ($this->extendedMode) { $testcase['ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ'] = 'αβγδεζηθικλμνξοσὠ'; } foreach ($testcase as $input => $output) { $this->assertEqual(drupal_strtolower($input), $output, format_string('%input is lowercased as %output', array('%input' => $input, '%output' => $output))); } } function helperTestStrToUpper() { $testcase = array( 'tHe QUIcK bRoWn' => 'THE QUICK BROWN', 'FrançAIS is ÜBER-åwesome' => 'FRANÇAIS IS ÜBER-ÅWESOME', ); if ($this->extendedMode) { $testcase['αβγδεζηθικλμνξοσὠ'] = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ'; } foreach ($testcase as $input => $output) { $this->assertEqual(drupal_strtoupper($input), $output, format_string('%input is uppercased as %output', array('%input' => $input, '%output' => $output))); } } function helperTestUcFirst() { $testcase = array( 'tHe QUIcK bRoWn' => 'THe QUIcK bRoWn', 'françAIS' => 'FrançAIS', 'über' => 'Über', 'åwesome' => 'Åwesome' ); if ($this->extendedMode) { $testcase['σion'] = 'Σion'; } foreach ($testcase as $input => $output) { $this->assertEqual(drupal_ucfirst($input), $output, format_string('%input is ucfirst-ed as %output', array('%input' => $input, '%output' => $output))); } } function helperTestStrLen() { $testcase = array( 'tHe QUIcK bRoWn' => 15, 'ÜBER-åwesome' => 12, ); foreach ($testcase as $input => $output) { $this->assertEqual(drupal_strlen($input), $output, format_string('%input length is %output', array('%input' => $input, '%output' => $output))); } } function helperTestSubStr() { $testcase = array( // 012345678901234567890123 array('frànçAIS is über-åwesome', 0, 0, ''), array('frànçAIS is über-åwesome', 0, 1, 'f'), array('frànçAIS is über-åwesome', 0, 8, 'frànçAIS'), array('frànçAIS is über-åwesome', 0, 23, 'frànçAIS is über-åwesom'), array('frànçAIS is über-åwesome', 0, 24, 'frànçAIS is über-åwesome'), array('frànçAIS is über-åwesome', 0, 25, 'frànçAIS is über-åwesome'), array('frànçAIS is über-åwesome', 0, 100, 'frànçAIS is über-åwesome'), array('frànçAIS is über-åwesome', 4, 4, 'çAIS'), array('frànçAIS is über-åwesome', 1, 0, ''), array('frànçAIS is über-åwesome', 100, 0, ''), array('frànçAIS is über-åwesome', -4, 2, 'so'), array('frànçAIS is über-åwesome', -4, 3, 'som'), array('frànçAIS is über-åwesome', -4, 4, 'some'), array('frànçAIS is über-åwesome', -4, 5, 'some'), array('frànçAIS is über-åwesome', -7, 10, 'åwesome'), array('frànçAIS is über-åwesome', 5, -10, 'AIS is üb'), array('frànçAIS is über-åwesome', 0, -10, 'frànçAIS is üb'), array('frànçAIS is über-åwesome', 0, -1, 'frànçAIS is über-åwesom'), array('frànçAIS is über-åwesome', -7, -2, 'åweso'), array('frànçAIS is über-åwesome', -7, -6, 'å'), array('frànçAIS is über-åwesome', -7, -7, ''), array('frànçAIS is über-åwesome', -7, -8, ''), array('...', 0, 2, '..'), array('以呂波耳・ほへとち。リヌルヲ。', 1, 3, '呂波耳'), ); foreach ($testcase as $test) { list($input, $start, $length, $output) = $test; $result = drupal_substr($input, $start, $length); $this->assertEqual($result, $output, format_string('%input substring at offset %offset for %length characters is %output (got %result)', array('%input' => $input, '%offset' => $start, '%length' => $length, '%output' => $output, '%result' => $result))); } } /** * Test decode_entities(). */ function testDecodeEntities() { $testcase = array( 'Drupal' => 'Drupal', '