#!/usr/bin/env python

"""This script indicates that PySide6 fails to handle embedded NULL characters in a string properly
when working with a QPlainTextEdit (or a QTextEdit).

Build information: Qt 6.3.0 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 10.3.1 20210422 (Red Hat 10.3.1-1)) [limited API]
Python: Python 3.9

Expected output:

    String passed to QPlainTextEdit.setPlainText(): 'A\x00B', length: 3
    String returned by QPlainTextEdit.toPlainText(): 'A\x00B', length: 3

Observed output:

    String passed to QPlainTextEdit.setPlainText(): 'A\x00B', length: 3
    String returned by QPlainTextEdit.toPlainText(): 'A', length: 1
    Traceback (most recent call last):
    File "/tmp/test/main.py", line 43, in <module>
        assert str1 == str2, \
    AssertionError: The string passed to QPlainTextEdit.setPlainText() and the string returned by QPlainTextEdit.toPlainText() are NOT equal!
"""
import sys
try:
    from PySide6.QtCore import QLibraryInfo, qVersion
    from PySide6.QtWidgets import QApplication, QPlainTextEdit
except ImportError:
    from PySide2.QtCore import QLibraryInfo, qVersion
    from PySide2.QtWidgets import QApplication, QPlainTextEdit



if __name__ == "__main__":

    print(f'Build information: {QLibraryInfo.build()}')
    print('Python {}.{}'.format(sys.version_info[0], sys.version_info[1]))
    
    app = QApplication(sys.argv)

    txtbox = QPlainTextEdit() # or a QTextEdit
    txtbox.setReadOnly(True)

    # A UTF-8 string containing embedded NULL characters.
    str1 = "A\x00B"
    assert len(str1) == 3

    txtbox.setPlainText(str1)
    
    print(f"String passed to QPlainTextEdit.setPlainText(): {str1.__repr__()}, length: {len(str1)}")

    str2 = txtbox.toPlainText()
    print(f"String returned by QPlainTextEdit.toPlainText(): {str2.__repr__()}, length: {len(str2)}")


    # Ensure the passed string and the returned string are equal
    # and strings are NOT truncated up to the first embedded NULL character
    assert str1 == str2, \
        "The string passed to QPlainTextEdit.setPlainText() and the string returned by QPlainTextEdit.toPlainText() are NOT equal!"

    txtbox.show()
    txtbox.setWindowTitle(qVersion())

    ex = 1
    try:
        ex = app.exec_()
    except AttributeError as e:
        print(e)
    sys.exit(ex)