CI_Utf8-related changes
- Give priority to mb_convert_encoding() over iconv() in clean_string() (partially fixes #261)
- Add more proper unit tests
diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php
index 95833fc..21ff6d8 100644
--- a/tests/codeigniter/core/Input_test.php
+++ b/tests/codeigniter/core/Input_test.php
@@ -13,6 +13,8 @@
$this->ci_set_config('csrf_protection', FALSE);
$security = new Mock_Core_Security();
+
+ $this->ci_set_config('charset', 'UTF-8');
$utf8 = new Mock_Core_Utf8();
$this->input = new Mock_Core_Input($security, $utf8);
diff --git a/tests/codeigniter/core/Utf8_test.php b/tests/codeigniter/core/Utf8_test.php
index 2cf4048..7e6ffd9 100644
--- a/tests/codeigniter/core/Utf8_test.php
+++ b/tests/codeigniter/core/Utf8_test.php
@@ -4,22 +4,88 @@
public function set_up()
{
+ $this->ci_set_config('charset', 'UTF-8');
$this->utf8 = new Mock_Core_Utf8();
+ $this->ci_instance_var('utf8', $this->utf8);
}
// --------------------------------------------------------------------
- public function test_convert_to_utf8()
+ /**
+ * __construct() test
+ *
+ * @covers CI_Utf8::__construct
+ */
+ public function test___construct()
{
- $this->assertEquals('ÑеÑÑ', $this->utf8->convert_to_utf8('òåñò', 'WINDOWS-1251'));
+ if (defined('PREG_BAD_UTF8_ERROR') && (ICONV_ENABLED === TRUE OR MB_ENABLED === TRUE) && strtoupper(config_item('charset')) === 'UTF-8')
+ {
+ $this->assertTrue(UTF8_ENABLED);
+ }
+ else
+ {
+ $this->assertFalse(UTF8_ENABLED);
+ }
}
// --------------------------------------------------------------------
+ /**
+ * is_ascii() test
+ *
+ * Note: DO NOT move this below test_clean_string()
+ */
public function test_is_ascii()
{
$this->assertTrue($this->utf8->is_ascii('foo bar'));
$this->assertFalse($this->utf8->is_ascii('тест'));
}
+ // --------------------------------------------------------------------
+
+ /**
+ * clean_string() test
+ *
+ * @depends test_is_ascii
+ * @covers CI_Utf8::clean_string
+ */
+ public function test_clean_string()
+ {
+ $this->assertEquals('foo bar', $this->utf8->clean_string('foo bar'));
+
+ $illegal_utf8 = "\xc0тест";
+ if (MB_ENABLED)
+ {
+ $this->assertEquals('тест', $this->utf8->clean_string($illegal_utf8));
+ }
+ elseif (ICONV_ENABLED)
+ {
+ // This is a known issue, iconv doesn't always work with //IGNORE
+ $this->assertTrue(in_array($this->utf8->clean_string($illegal_utf8), array('тест', ''), TRUE));
+ }
+ else
+ {
+ $this->assertEquals($illegal_utf8, $this->utf8->clean_string($illegal_utf8));
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * convert_to_utf8() test
+ *
+ * @covers CI_Utf8::convert_to_utf8
+ */
+ public function test_convert_to_utf8()
+ {
+ if (MB_ENABLED OR ICONV_ENABLED)
+ {
+ $this->assertEquals('ÑеÑÑ', $this->utf8->convert_to_utf8('òåñò', 'WINDOWS-1251'));
+ }
+ else
+ {
+ $this->assertFalse($this->utf8->convert_to_utf8('òåñò', 'WINDOWS-1251'));
+ }
+ }
+
}
\ No newline at end of file
diff --git a/tests/mocks/core/utf8.php b/tests/mocks/core/utf8.php
index c8214a6..3a6282e 100644
--- a/tests/mocks/core/utf8.php
+++ b/tests/mocks/core/utf8.php
@@ -5,12 +5,15 @@
/**
* We need to define UTF8_ENABLED the same way that
* CI_Utf8 constructor does.
- *
- * @covers CI_Utf8::__construct()
*/
public function __construct()
{
- defined('UTF8_ENABLED') OR define('UTF8_ENABLED', TRUE);
+ if (defined('UTF8_ENABLED'))
+ {
+ return;
+ }
+
+ parent::__construct();
}
}
\ No newline at end of file