RegressionTests__CharacterTests.st
author Jan Vrany <jan.vrany@labware.com>
Mon, 08 Mar 2021 11:25:35 +0000
branchjv
changeset 2594 e5f39c0a5bd6
parent 1974 f2eaf05205d6
permissions -rwxr-xr-x
Improve UTF8 read/write tests in `ChangeSetTests`

"
 COPYRIGHT (c) Claus Gittinger / eXept Software AG
 COPYRIGHT (c) 2015 Jan Vrany
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
"{ Package: 'stx:goodies/regression' }"

"{ NameSpace: RegressionTests }"

TestCase subclass:#CharacterTests
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'tests-Regression'
!

!CharacterTests class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) Claus Gittinger / eXept Software AG
 COPYRIGHT (c) 2015 Jan Vrany
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
! !

!CharacterTests methodsFor:'tests'!

test01_CaseTesting
    "test lower/uppercase return value for all unicode characters up to 16r1C6FF (i.e. Unicode 3.2)"

    |unicodeDataFile|

    unicodeDataFile := self class packageDirectory / 'testData' / 'UnicodeData-4.0.0.txt'.
    "/ unicodeDataFile := '/Users/cg/work/exept/regression/testData/UnicodeData-4.0.0.txt' asFilename .
    "/ unicodeDataFile := '/Users/cg/work/exept/regression/testData/UnicodeData-4.0.0.txt' asFilename .

    CharacterEncoderCodeGenerator isNil ifTrue:[
	Smalltalk fileInClass:'CharacterEncoderCodeGenerator' package:'stx:goodies'
    ].

    CharacterEncoderCodeGenerator new
	readingUnicodeDataFrom:(unicodeDataFile readStream)
	do:[:codePoint :name :category :canOrd :bidiCat :decMap
	    :decDigitValue :digitValue :numValue
	    :mirrored :unicodeName :comment :ucValue :lcValue :tcValue |
		|ch ucCh lcCh tcCh isUppercase isLowercase isTitlecase isLetter dToUc dToLc|

		"/ for now, do not check above 1C6FF (i.e. only Uniode 3.2)
		codePoint <= 16r1C6FF ifTrue:[
		    isUppercase := category = 'Lu'.
		    isLowercase := category = 'Ll'.
		    isTitlecase := category = 'Lt'.
		    isLetter := isUppercase | isLowercase | isTitlecase
				or:[(category = 'Lm') or:[(category = 'Lo')]].

		    ch := Character value:codePoint.
		    self assert:(ch isUppercase == isUppercase) description:('isUppercase of ',ch codePoint asString).
		    self assert:(ch isLowercase == isLowercase) description:('isLowercase of ',ch codePoint asString).
		    "/ self assert:(ch isTitlecase == isTitlecase).
		    self assert:(ch isNationalLetter == isLetter) description:('isNationalLetter of ',ch codePoint asString).

		    ucValue notNil ifTrue:[
			ucCh := Character value:ucValue.
			self assert:(ch asUppercase = ucCh) description:('asUppercase of ',ch codePoint asString).
		    ] ifFalse:[
			self assert:(ch asUppercase = ch) description:('asUppercase of ',ch codePoint asString).
		    ].
		    lcValue notNil ifTrue:[
			lcCh := Character value:lcValue.
			self assert:(ch asLowercase = lcCh) description:('asLowercase of ',ch codePoint asString).
		    ] ifFalse:[
			self assert:(ch asLowercase = ch) description:('asLowercase of ',ch codePoint asString).
		    ].
		    tcValue notNil ifTrue:[
			tcCh := Character value:tcValue.
			self assert:(ch asTitlecase = tcCh) description:('asTitlecase of ',ch codePoint asString).
		    ] ifFalse:[
			self assert:(ch asTitlecase = ch) description:('asTitlecase of ',ch codePoint asString).
		    ].
		].
	].

    "
     self new test01CaseTesting
    "

    "Modified (comment): / 05-08-2011 / 18:59:24 / cg"
!

test02_Concatenation
    "test , operator on characters (to test against possible inlining or compiler optimizations, use variables, not constants)"

    |a b r s s2|

    s := ($a to: $z) asString.
    s2 :=($b to: $z) asString.

    "/ char , string
    a := $a. b := ''.     self assert:(r := a,b) = 'a'.
    a := $a. b := 'b'.    self assert:(r := a,b) = 'ab'.
    a := $a. b := 'bc'.   self assert:(r := a,b) = 'abc'.
    a := $a. b := 'bcd'.  self assert:(r := a,b) = 'abcd'.
    a := $a. b := 'bcde'. self assert:(r := a,b) = 'abcde'.
    "/ just in case there is some wordlength related problem...
    1 to:20 do:[:n |
	self assert:($a,(s2 copyTo:n)) = (s copyTo:n+1)
    ].

    "/ char , char
    a := $a. b := $b.     self assert:(r := a,b) = 'ab'.

    s2 :=($a to: $y) asString.
    "/ string, char
    a := $a. b := ''.     self assert:(r := b,a) = 'a'.
    a := $a. b := 'b'.    self assert:(r := b,a) = 'ba'.
    a := $a. b := 'bc'.   self assert:(r := b,a) = 'bca'.
    a := $a. b := 'bcd'.  self assert:(r := b,a) = 'bcda'.
    a := $a. b := 'bcde'. self assert:(r := b,a) = 'bcdea'.
    "/ just in case there is some wordlength related problem...
    1 to:20 do:[:n |
	self assert:((s2 copyLast:n),$z) = (s copyLast:n+1)
    ].

    "
     self new test02_Concatenation
    "

    "Modified (comment): / 05-08-2011 / 18:59:24 / cg"
! !

!CharacterTests class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !