diff --git a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php
index 5f49a6d..60d558d 100644
--- a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php
+++ b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php
@@ -12,6 +12,8 @@
 
 /**
  * Test unicode handling features implemented in Unicode component.
+ *
+ * @see \Drupal\Component\Utility\Unicode
  */
 class UnicodeTest extends UnitTestCase {
 
@@ -82,9 +84,11 @@ public function testMimeHeader($value, $encoded) {
    * @return array
    *   An array containing a string and its encoded value.
    */
-  public function providerTestMimeHeader() {
+  public static function providerTestMimeHeader() {
     return array(
       array('tést.txt', '=?UTF-8?B?dMOpc3QudHh0?='),
+      // Simple ASCII characters.
+      array('ASCII', 'ASCII'),
     );
   }
 
@@ -109,7 +113,7 @@ public function testStrtolower($text, $expected, $multibyte = FALSE) {
    *   An array containing a string, its lowercase version and whether it should
    *   be processed as multibyte.
    */
-  public function providerStrtolower() {
+  public static function providerStrtolower() {
     $cases = array(
       array('tHe QUIcK bRoWn', 'the quick brown'),
       array('FrançAIS is ÜBER-åwesome', 'français is über-åwesome'),
@@ -144,7 +148,7 @@ public function testStrtoupper($text, $expected, $multibyte = FALSE) {
    *   An array containing a string, its uppercase version and whether it should
    *   be processed as multibyte.
    */
-  public function providerStrtoupper() {
+  public static function providerStrtoupper() {
     $cases = array(
       array('tHe QUIcK bRoWn', 'THE QUICK BROWN'),
       array('FrançAIS is ÜBER-åwesome', 'FRANÇAIS IS ÜBER-ÅWESOME'),
@@ -176,7 +180,7 @@ public function testUcfirst($text, $expected) {
    * @return array
    *   An array containing a string and its uppercase first version.
    */
-  public function providerUcfirst() {
+  public static function providerUcfirst() {
     return array(
       array('tHe QUIcK bRoWn', 'THe QUIcK bRoWn'),
       array('françAIS', 'FrançAIS'),
@@ -193,6 +197,11 @@ public function providerUcfirst() {
    * @dataProvider providerStrlen
    */
   public function testStrlen($text, $expected) {
+    // Run through multibyte code path.
+    Unicode::setStatus(Unicode::STATUS_MULTIBYTE);
+    $this->assertEquals($expected, Unicode::strlen($text));
+    // Run through singlebyte code path.
+    Unicode::setStatus(Unicode::STATUS_SINGLEBYTE);
     $this->assertEquals($expected, Unicode::strlen($text));
   }
 
@@ -204,7 +213,7 @@ public function testStrlen($text, $expected) {
    * @return array
    *   An array containing a string and its length.
    */
-  public function providerStrlen() {
+  public static function providerStrlen() {
     return array(
       array('tHe QUIcK bRoWn', 15),
       array('ÜBER-åwesome', 12),
@@ -217,6 +226,11 @@ public function providerStrlen() {
    * @dataProvider providerSubstr
    */
   public function testSubstr($text, $start, $length, $expected) {
+    // Run through multibyte code path.
+    Unicode::setStatus(Unicode::STATUS_MULTIBYTE);
+    $this->assertEquals($expected, Unicode::substr($text, $start, $length));
+    // Run through singlebyte code path.
+    Unicode::setStatus(Unicode::STATUS_SINGLEBYTE);
     $this->assertEquals($expected, Unicode::substr($text, $start, $length));
   }
 
@@ -232,7 +246,7 @@ public function testSubstr($text, $start, $length, $expected) {
    *     - The length number to be processed by substr.
    *     - The expected string result.
    */
-  public function providerSubstr() {
+  public static function providerSubstr() {
     return array(
       array('frànçAIS is über-åwesome', 0, 0, ''),
       array('frànçAIS is über-åwesome', 0, 1, 'f'),
@@ -284,7 +298,7 @@ public function testTruncate($text, $max_length, $expected, $wordsafe = FALSE, $
    *     - (optional) Boolean for the $wordsafe flag. Defaults to FALSE.
    *     - (optional) Boolean for the $add_ellipsis flag. Defaults to FALSE.
    */
-  public function providerTruncate() {
+  public static function providerTruncate() {
     return array(
       array('frànçAIS is über-åwesome', 24, 'frànçAIS is über-åwesome'),
       array('frànçAIS is über-åwesome', 23, 'frànçAIS is über-åwesom'),
@@ -333,4 +347,107 @@ public function providerTruncate() {
     );
   }
 
+  /**
+   * Tests Unicode::truncateBytes().
+   *
+   * @param string $text
+   *   The string to truncate.
+   * @param int $max_length
+   *   The upper limit on the returned string length.
+   * @param string $expected
+   *   The expected return from Unicode::truncateBytes().
+   *
+   * @dataProvider providerTestTruncateBytes
+   */
+  public function testTruncateBytes($text, $max_length, $expected) {
+    $this->assertEquals($expected, Unicode::truncateBytes($text, $max_length), 'The string was not correctly truncated.');
+  }
+
+  /**
+   * Provides data for self::testTruncateBytes().
+   *
+   * @return array
+   *   An array of arrays, each containing the parameters to
+   *   self::testTruncateBytes().
+   */
+  public static function providerTestTruncateBytes() {
+    return array(
+      // String shorter than max length.
+      array('Short string', 42, 'Short string'),
+      // Simple string longer than max length.
+      array('Longer string than previous.', 10, 'Longer str'),
+      // Unicode.
+      array('以呂波耳・ほへとち。リヌルヲ。', 10, '以呂波'),
+    );
+  }
+
+  /**
+   * Tests Unicode::validateUtf8().
+   *
+   * @param string $text
+   *   The text to validate.
+   * @param boolean $expected
+   *   The expected return value from Unicode::validateUtf8().
+   * @param string $message
+   *   The message to display on failure.
+   *
+   * @dataProvider providerTestValidateUtf8
+   */
+  public function testValidateUtf8($text, $expected, $message) {
+    $this->assertEquals($expected, Unicode::validateUtf8($text), $message);
+  }
+
+  /**
+   * Provides data for self::testValidateUtf8().
+   *
+   * @return array
+   *   An array of arrays, each containing the parameters for
+   *   self::testValidateUtf8().
+   *
+   * Invalid UTF-8 examples sourced from http://stackoverflow.com/a/11709412/109119.
+   */
+  public static function providerTestValidateUtf8() {
+    return array(
+      // Empty string.
+      array('', TRUE, 'An empty string did not validate.'),
+      // Simple text string.
+      array('Simple text.', TRUE, 'A simple ASCII text string did not validate.'),
+      // Invalid UTF-8, overlong 5 byte encoding.
+      array(chr(0xF8) . chr(0x80) . chr(0x80) . chr(0x80) . chr(0x80), FALSE, 'Invalid UTF-8 was validated.'),
+      // High code-point without trailing characters.
+      array(chr(0xD0) . chr(0x01), FALSE, 'Invalid UTF-8 was validated.'),
+    );
+  }
+
+  /**
+   * Tests Unicode::convertToUtf8().
+   *
+   * @param string $data
+   *   The data to be converted.
+   * @param string $encoding
+   *   The encoding the data is in.
+   * @param string|bool $expected
+   *   The expected result.
+   *
+   * @dataProvider providerTestConvertToUtf8
+   */
+  public function testConvertToUtf8($data, $encoding, $expected) {
+    $this->assertEquals($expected, Unicode::convertToUtf8($data, $encoding));
+  }
+
+  /**
+   * Provides data to self::testConvertToUtf8().
+   *
+   * @return array
+   *   An array of arrays, each containg the parameters to
+   *   self::testConvertUtf8().  }
+   */
+  public static function providerTestConvertToUtf8() {
+    return array(
+      array(chr(0x97), 'Windows-1250', '—'),
+      array(chr(0x99), 'Windows-1250', '™'),
+      array(chr(0x80), 'Windows-1250', '€'),
+    );
+  }
+
 }
