# -*- coding: UTF-8
"""
Test issue #336: Unicode problem w/ exception traceback on Windows (python2.7)
Default encoding (unicode-escape) of text() causes problems w/
exception tracebacks.

STATUS: BASICS SOLVED (default encoding changed)

ALTERNATIVE SOLUTIONS:
* Use traceback2: Returns unicode-string when calling traceback.
* Use text(traceback.format_exc(), sys.getfilesystemencoding(), "replace")
  where the text-conversion of a traceback is used.
  MAYBE traceback_to_text(traceback.format_exc())
"""

from __future__ import print_function
from behave.textutil import text
import pytest
import six

# require_python2 = pytest.mark.skipif(not six.PY2, reason="REQUIRE: Python2")
# require_python3 = pytest.mark.skipif(six.PY2, reason="REQUIRE: Python3 (or newer)")


class TestIssue(object):
    # -- USE SAVED TRACEBACK: No need to require Windows platform.
    traceback_bytes = br"""\
Traceback (most recent call last):
  File "C:\Users\alice\xxx\behave\model.py", line 1456, in run
    match.run(runner.context)
  File "C:\Users\alice\xxx\behave\model.py", line 1903, in run
    self.func(context, args, *kwargs)
  File "features\steps\my_steps.py", line 210, in step_impl
    directories, task_names, reg_keys)
AssertionError
"""

    traceback_file_line_texts = [
        # -- NOTE: Cannot use: ur'C:\Users ..." => \U is a unicode escape char.
        u'File "C:\\Users\\alice\\xxx\\behave\\model.py", line 1456, in run',
        u'File "C:\\Users\\alice\\xxx\\behave\\model.py", line 1903, in run',
        u'File "features\\steps\\my_steps.py", line 210, in step_impl',
    ]

    # @require_python2
    def test_issue__with_default_encoding(self):
        """Test ensures that problem is fixed with default encoding"""
        text2 = text(self.traceback_bytes)
        assert isinstance(self.traceback_bytes, bytes)
        assert isinstance(text2, six.text_type)
        for file_line_text in self.traceback_file_line_texts:
            assert file_line_text in text2

    # @require_python2
    def test__problem_exists_with_problematic_encoding(self):
        """Test ensures that problem exists with encoding=unicode-escape"""
        # -- NOTE: Explicit use of problematic encoding
        problematic_encoding = "unicode-escape"
        text2 = text(self.traceback_bytes, problematic_encoding)
        print("TEXT: "+ text2)
        assert isinstance(self.traceback_bytes, bytes)
        assert isinstance(text2, six.text_type)

        # -- VERIFY BAD-OUTCOME: With problematic encoding
        file_line_text = self.traceback_file_line_texts[0]
        assert file_line_text not in text2