[squeak-dev] Squeak 4.6: MultilingualTests-fbs.18.mcz
H. Hirzel
hannes.hirzel at gmail.com
Thu Jan 19 06:57:48 UTC 2017
Reactivating an old thread ...
Taking the test above just gives a question mark for the fallback font case
| text font bb destPoint |
text := (Character value: 257) asString asText.
font := TextStyle default fontOfSize: 21.
text addAttribute: (TextFontReference toFont: font).
bb := (Form extent: 100 @ 30) getCanvas privatePort.
bb combinationRule: Form paint.
font installOn: bb foregroundColor: Color black
backgroundColor: Color white.
destPoint := font displayString: text asString on: bb from: 1
to: 1 at: 0 at 0 kern: 1.
bb destForm asMorph openInHand.
Is there another fallback font readily available which gives for small
hex numbers for the missing characters?
--Hannes
On Fri, 5 Jun 2015 20:20:36.139 0000, commits at source.squeak.org
<commits at source.squeak.org> wrote:
> Chris Muller uploaded a new version of MultilingualTests to project Squeak
> 4.6:
> http://source.squeak.org/squeak46/MultilingualTests-fbs.18.mcz
>
> ==================== Summary ====================
>
> Name: MultilingualTests-fbs.18
> Author: fbs
> Time: 6 November 2013, 6:35:02.811 pm
> UUID: 07e26018-8455-3349-9b44-9ecb4aaeefb2
> Ancestors: MultilingualTests-nice.17
>
> More #shouldnt:raise: Error fixes.
>
> ==================== Snapshot ====================
>
> SystemOrganization addCategory: #'MultilingualTests-TextConversion'!
> SystemOrganization addCategory: #'MultilingualTests-Display'!
>
> TestCase subclass: #FontTest
> instanceVariableNames: ''
> classVariableNames: ''
> poolDictionaries: ''
> category: 'MultilingualTests-Display'!
>
> !FontTest commentStamp: 'tak 3/11/2005 14:31' prior: 0!
> I am mainly a test for fallback font.
> FontTest buildSuite run!
>
> ----- Method: FontTest>>testDisplay (in category 'testing') -----
> testDisplay
> "self debug: #testDisplay"
> | text font bb destPoint width |
> text := 'test' asText.
> font := TextStyle default fontOfSize: 21.
> text addAttribute: (TextFontReference toFont: font).
> bb := (Form extent: 100 @ 30) getCanvas privatePort.
> bb combinationRule: Form paint.
>
> font installOn: bb foregroundColor: Color black backgroundColor: Color
> white.
> destPoint := font displayString: text asString on: bb from: 1 to: 4 at: 0 at 0
> kern: 1.
>
> width := text inject: 0 into: [:max :char | max + (font widthOf: char)].
> self assert: destPoint x = (width + 4).
> "bb destForm asMorph openInHand."
> !
>
> ----- Method: FontTest>>testFallback (in category 'testing') -----
> testFallback
> "self debug: #testFallback"
> | text font bb destPoint |
> text := (Character value: 257) asString asText.
> font := TextStyle default fontOfSize: 21.
> text addAttribute: (TextFontReference toFont: font).
> bb := (Form extent: 100 @ 30) getCanvas privatePort.
> bb combinationRule: Form paint.
>
> font installOn: bb foregroundColor: Color black backgroundColor: Color
> white.
> destPoint := font displayString: text asString on: bb from: 1 to: 1 at: 0 at 0
> kern: 1.
>
> "bb destForm asMorph openInHand."
> self assert: destPoint x = ((font widthOf: $?) + 1).
> !
>
> ----- Method: FontTest>>testMultistringFallbackFont (in category 'testing')
> -----
> testMultistringFallbackFont
> "self debug: #testMultistringFallbackFont"
> | text p style height width |
> [(TextStyle default fontArray at: JapaneseEnvironment leadingChar)
> ifNil: [^ self]]
> ifError: [:err :rcvr | ^ self].
> text := ((#(20983874 20983876 20983878 )
> collect: [:e | e asCharacter])
> as: String) asText.
> p := NewParagraph new.
> style := TextStyle new leading: 0; newFontArray: {Preferences
> standardFlapFont}.
> p
> compose: text
> style: style
> from: 1
> in: (0 @ 0 corner: 100 @ 100).
> "See CompositionScanner>>setActualFont: &
> CompositionScanner>>composeFrom:inRectangle:firstLine:leftSide:rightSide:"
> height := style defaultFont height + style leading.
> width := text
> inject: 0
> into: [:tally :next | tally
> + (style defaultFont widthOf: next)].
> p adjustRightX.
> self assert: p extent = (width @ height).
> "Display getCanvas
> paragraph: p
> bounds: (10 @ 10 extent: 100 @ 100)
> color: Color black"!
>
> ----- Method: FontTest>>testMultistringFont (in category 'testing') -----
> testMultistringFont
> "self debug: #testMultistringFont"
> | text p style height width |
> [(TextStyle default fontArray at: JapaneseEnvironment leadingChar)
> ifNil: [^ self]]
> ifError: [:err :rcvr | ^ self].
> text := ((#(20983874 20983876 20983878 )
> collect: [:e | e asCharacter])
> as: String) asText.
> p := NewParagraph new.
> style := TextStyle default.
> p
> compose: text
> style: style
> from: 1
> in: (0 @ 0 corner: 100 @ 100).
> "See CompositionScanner>>setActualFont: &
> CompositionScanner>>composeFrom:inRectangle:firstLine:leftSide:rightSide:"
> height := style defaultFont height + style leading.
> width := text
> inject: 0
> into: [:tally :next | tally
> + (style defaultFont widthOf: next)].
> p adjustRightX.
> self assert: p extent = (width @ height).
> "Display getCanvas
> paragraph: p
> bounds: (10 @ 10 extent: 100 @ 100)
> color: Color black"!
>
> ----- Method: FontTest>>testParagraph (in category 'testing') -----
> testParagraph
> "self debug: #testParagraph"
> | text p style height width |
> text := 'test' asText.
> p := NewParagraph new.
> style := TextStyle default.
> p
> compose: text
> style: style
> from: 1
> in: (0 @ 0 corner: 100 @ 100).
> "See CompositionScanner>>setActualFont: &
> CompositionScanner>>composeFrom:inRectangle:firstLine:leftSide:rightSide:"
> height := style defaultFont height + style leading.
> width := text
> inject: 0
> into: [:tally :next | tally
> + (style defaultFont widthOf: next)].
> p adjustRightX.
> self assert: p extent = (width @ height)!
>
> ----- Method: FontTest>>testParagraphFallback (in category 'testing') -----
> testParagraphFallback
> "self debug: #testParagraphFallback"
> | text p style height width e expect |
> e := (Character value: 257) asString.
> text := ('test' , e , e , e , e , 'test') asText.
> expect := 'test????test'.
> p := NewParagraph new.
> style := TextStyle default.
> p
> compose: text
> style: style
> from: 1
> in: (0 @ 0 corner: 100 @ 100).
> "See CompositionScanner>>setActualFont: &
> CompositionScanner>>composeFrom:inRectangle:firstLine:leftSide:rightSide:"
> height := style defaultFont height + style leading.
> width := expect
> inject: 0
> into: [:tally :next | tally
> + (style defaultFont widthOf: next)].
> p adjustRightX.
> self assert: p extent = (width @ height).
> "Display getCanvas
> paragraph: p
> bounds: (10 @ 10 extent: 100 @ 100)
> color: Color black"!
>
> ----- Method: FontTest>>testResetAfterEmphasized (in category 'testing')
> -----
> testResetAfterEmphasized
> "self debug: #testResetAfterEmphasized"
> | normal derivative |
> normal := TextStyle defaultFont.
> derivative := normal emphasized: 3.
> self assert: (normal derivativeFonts at: 3) == derivative.
> normal reset.
> self assert: (normal derivativeFonts select:[:any| any isSynthetic])
> isEmpty
> !
>
> TestCase subclass: #MultiByteFileStreamTest
> instanceVariableNames: 'fileName'
> classVariableNames: ''
> poolDictionaries: ''
> category: 'MultilingualTests-TextConversion'!
>
> ----- Method: MultiByteFileStreamTest>>tearDown (in category 'running')
> -----
> tearDown
>
> fileName ifNotNil: [
> FileDirectory default deleteFileNamed: fileName ]!
>
> ----- Method: MultiByteFileStreamTest>>testAsciiBackChunk (in category
> 'testing') -----
> testAsciiBackChunk
>
> fileName := 'foobackchunk.txt'.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> lineEndConvention: #cr;
> converter: UTF8TextConverter new;
> cr; nextChunkPut: 'test1' printString;
> cr; nextChunkPut: 'test2' printString.
> self
> assert: file backChunk = (String cr , 'test2' printString);
> assert: file backChunk = (String cr , 'test1' printString) ]!
>
> ----- Method: MultiByteFileStreamTest>>testBinaryUpTo (in category
> 'testing') -----
> testBinaryUpTo
> "This is a non regression test for bug
> http://bugs.squeak.org/view.php?id=6933"
>
> fileName := 'foobug6933'.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> binary;
> nextPutAll: #[ 1 2 3 4 ] ].
> MultiByteFileStream oldFileNamed: fileName do: [ :file |
> file binary.
> self assert: (file upTo: 3) = #[ 1 2 ] ]!
>
> ----- Method: MultiByteFileStreamTest>>testByteTextConverter (in category
> 'testing') -----
> testByteTextConverter
> | strings converterClasses |
> strings := {
> String newFrom: ((0 to: 255) collect: [:e | e asCharacter]).
> }.
>
> converterClasses := ByteTextConverter allSubclasses.
> converterClasses do: [:converterClass |
> strings do: [:string | | converter stream encoded decoded encoded2 |
> converter := converterClass new.
> stream := string readStream.
> encoded := string select: [:e | (converter nextFromStream: stream)
> notNil].
> stream := encoded readStream.
> decoded := encoded collect: [:e | converter nextFromStream: stream].
> self assert: stream atEnd.
> stream := String new writeStream.
> converter nextPutAll: decoded toStream: stream.
> encoded2 := stream contents.
> self assert: (encoded2 collect: [:e | e charCode] as: Array) = (encoded
> collect: [:e | e charCode] as: Array).
> stream := String new writeStream.
> decoded do: [:e | converter nextPut: e toStream: stream].
> encoded2 := stream contents.
> self assert: (encoded2 collect: [:e | e charCode] as: Array) = (encoded
> collect: [:e | e charCode] as: Array)]]!
>
> ----- Method:
> MultiByteFileStreamTest>>testLineEndConvention:withConverter:ifFail: (in
> category 'helpers') -----
> testLineEndConvention: lineEndConvention withConverter: textConverterClass
> ifFail: failBlock
>
> | expectedResult result |
> [
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> converter: textConverterClass new;
> lineEndConvention: lineEndConvention;
> cr;
> nextPut: Character cr;
> nextPutAll: String cr;
> nextPutAll: String cr asWideString ].
> result := StandardFileStream oldFileNamed: fileName do: [ :file |
> file contents ].
> expectedResult := String streamContents: [ :stream |
> 4 timesRepeat: [ stream perform: lineEndConvention ] ].
> result = expectedResult ifFalse: [
> failBlock value: expectedResult asByteArray value: result asByteArray ]
> ]
> on: Error
> do: [ :err | failBlock value: err messageText value: err messageText ]!
>
> ----- Method: MultiByteFileStreamTest>>testLineEndConversion (in category
> 'testing') -----
> testLineEndConversion
>
> | failures |
> fileName := 'foolinendconversion.txt'.
> failures := OrderedCollection new.
> TextConverter allSubclassesDo: [ :textConverterClass |
> textConverterClass encodingNames ifNotEmpty: [
> #(cr lf crlf) do: [ :lineEndConvention |
> self
> testLineEndConvention: lineEndConvention
> withConverter: textConverterClass
> ifFail: [ :expectedResult :result |
> failures add: {
> textConverterClass.
> lineEndConvention.
> expectedResult.
> result } ] ] ] ].
> self assert: failures isEmpty!
>
> ----- Method: MultiByteFileStreamTest>>testLineEnding (in category
> 'testing') -----
> testLineEnding
>
> fileName := 'foolinend.txt'.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> wantsLineEndConversion: false;
> nextPutAll: 'line 1'; cr;
> nextPutAll: 'line 2'; crlf;
> nextPutAll: 'line 3'; lf;
> nextPutAll: 'line 4' ].
> {
> {#cr. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String cr
> , 'line 4'}.
> {#lf. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String cr
> , 'line 4'}.
> {#crlf. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String
> cr , 'line 4'}.
> {nil. 'line 1' , String cr , 'line 2' , String crlf , 'line 3' , String
> lf , 'line 4'}
> } do: [:lineEndingResult |
> MultiByteFileStream oldFileNamed: fileName do: [ :file |
> file lineEndConvention: lineEndingResult first.
> self assert: file upToEnd = lineEndingResult last ] ]!
>
> ----- Method: MultiByteFileStreamTest>>testLineEndingChunk (in category
> 'testing') -----
> testLineEndingChunk
>
> fileName := 'foolinend.txt'.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> wantsLineEndConversion: false;
> nextPutAll: 'line 1'; cr;
> nextPutAll: 'line 2'; crlf;
> nextPutAll: 'line 3'; lf;
> nextPutAll: 'line 4'; nextPut: $!! ].
> {
> {#cr. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String cr
> , 'line 4'}.
> {#lf. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String cr
> , 'line 4'}.
> {#crlf. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String
> cr , 'line 4'}.
> {nil. 'line 1' , String cr , 'line 2' , String crlf , 'line 3' , String
> lf , 'line 4'}
> } do: [:lineEndingResult |
> MultiByteFileStream oldFileNamed: fileName do: [ :file |
> file lineEndConvention: lineEndingResult first.
> self assert: lineEndingResult last equals: file nextChunk ] ]!
>
> ----- Method: MultiByteFileStreamTest>>testLineEndingWithWideStrings (in
> category 'testing') -----
> testLineEndingWithWideStrings
>
> | cr lf crlf |
> fileName := 'foolinend.txt'.
> cr := String cr asWideString.
> lf := String lf asWideString.
> crlf := String crlf asWideString.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> wantsLineEndConversion: false;
> nextPutAll: 'line 1'; nextPutAll: cr;
> nextPutAll: 'line 2'; nextPutAll: crlf;
> nextPutAll: 'line 3'; nextPutAll: lf;
> nextPutAll: 'line 4' ].
> {
> {#cr. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String cr
> , 'line 4'}.
> {#lf. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String cr
> , 'line 4'}.
> {#crlf. 'line 1' , String cr , 'line 2' , String cr , 'line 3' , String
> cr , 'line 4'}.
> {nil. 'line 1' , String cr , 'line 2' , String crlf , 'line 3' , String
> lf , 'line 4'}
> } do: [ :lineEndingResult |
> MultiByteFileStream oldFileNamed: fileName do: [ :file |
> file lineEndConvention: lineEndingResult first.
> self assert: file upToEnd = lineEndingResult last ] ]!
>
> ----- Method: MultiByteFileStreamTest>>testMultiByteTextConverter (in
> category 'testing') -----
> testMultiByteTextConverter
> | strings converterClasses |
> strings := {
> String newFrom: ((0 to: 255) collect: [:e | Unicode value: e]).
> String newFrom: ((0 to: 1023) collect: [:e | Unicode value: e]).
> }.
>
> converterClasses := {
> UTF8TextConverter . UTF16TextConverter .
> "CompoundTextConverter ."
> "EUCJPTextConverter . CNGBTextConverter . ShiftJISTextConverter .
> EUCKRTextConverter"}.
> converterClasses do: [:converterClass |
> strings do: [:string |
> | converter stream |
> converter := converterClass new.
> stream := String new writeStream.
> converter nextPutAll: string toStream: stream.
> stream := stream contents readStream.
> string do: [:e | | decoded |
> decoded := converter nextFromStream: stream.
> self assert: e charCode = decoded charCode].
> self assert: stream atEnd.
>
> stream := String new writeStream.
> string do: [:e | converter nextPut: e toStream: stream].
> stream := stream contents readStream.
> string do: [:e | | decoded |
> decoded := converter nextFromStream: stream.
> self assert: e charCode = decoded charCode].
> self assert: stream atEnd]]!
>
> ----- Method: MultiByteFileStreamTest>>testNextLine (in category 'testing')
> -----
> testNextLine
>
> fileName := 'foonextline.txt'.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> wantsLineEndConversion: false;
> nextPutAll: 'line 1'; cr;
> nextPutAll: 'line 2'; crlf;
> nextPutAll: 'line 3'; lf;
> nextPutAll: 'line 4' ].
> #(cr lf crlf nil) do: [:lineEnding |
> MultiByteFileStream oldFileNamed: fileName do: [ :file |
> file lineEndConvention: lineEnding.
> self
> assert: file nextLine = 'line 1';
> assert: file nextLine = 'line 2';
> assert: file nextLine = 'line 3';
> assert: file nextLine = 'line 4';
> assert: file nextLine = nil ] ]!
>
> ----- Method: MultiByteFileStreamTest>>testNextPutAllStartingAt (in category
> 'testing') -----
> testNextPutAllStartingAt
>
> | result |
> fileName := 'foonextputallstartingat.txt'.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> { 'abcde' asWideString. 'abcde' } do: [ :string |
> file
> next: 1 putAll: string startingAt: 5;
> next: 3 putAll: string startingAt: 2;
> next: 1 putAll: string startingAt: 1 ] ].
> result := StandardFileStream readOnlyFileNamed: fileName do: [ :file |
> file binary; contents ].
> self assert: #[101 98 99 100 97 101 98 99 100 97] equals: result
> !
>
> ----- Method: MultiByteFileStreamTest>>testNonAsciiBackChunk (in category
> 'testing') -----
> testNonAsciiBackChunk
> "Note: this is an expected failure: MultiByteFileStream is not equipped to
> read back non ASCII String... (no comment)
> As a consequence, never use non ASCII in method category nor in your
> initials. That would make a few tools blind..."
>
> fileName := 'foobackchunk.txt'.
> MultiByteFileStream forceNewFileNamed: fileName do: [ :file |
> file
> lineEndConvention: #cr;
> converter: UTF8TextConverter new;
> cr; nextChunkPut: 'testé' printString;
> cr; nextChunkPut: 'test' printString.
> self assert: file backChunk = (String cr , 'test' printString).
> self assert: file backChunk = (String cr , 'testé' printString) ]!
>
> TestCase subclass: #UTF16TextConverterTest
> instanceVariableNames: ''
> classVariableNames: ''
> poolDictionaries: ''
> category: 'MultilingualTests-TextConversion'!
>
> ----- Method: UTF16TextConverterTest>>testByteOrders (in category 'testing')
> -----
> testByteOrders
> |converter originalText bytes decodedText |
> originalText := 'test'.
> converter := UTF16TextConverter new.
>
> "Default (ie useLittleEndian instvar nil)"
> bytes := (originalText convertToWithConverter: converter).
> decodedText := bytes convertFromWithConverter: converter.
>
> self assert: originalText equals: decodedText.
>
> "Little-endian"
> converter useLittleEndian: true.
>
> bytes := (originalText convertToWithConverter: converter).
> decodedText := bytes convertFromWithConverter: converter.
>
> self assert: originalText equals: decodedText.
>
> "Big-endian"
> converter useLittleEndian: false.
>
> bytes := (originalText convertToWithConverter: converter).
> decodedText := bytes convertFromWithConverter: converter.
>
> self assert: originalText equals: decodedText.
>
> !
>
> ClassTestCase subclass: #UTF8TextConverterTest
> instanceVariableNames: ''
> classVariableNames: ''
> poolDictionaries: ''
> category: 'MultilingualTests-TextConversion'!
>
> ----- Method: UTF8TextConverterTest>>testLazyConversion (in category
> 'tests') -----
> testLazyConversion
> "Ensure the lazy conversions do what they should"
>
> | strict result |
> strict := UTF8TextConverter strictUtf8Conversions.
> [UTF8TextConverter strictUtf8Conversions: false.
> result := 'Grüß Gott' utf8ToSqueak.
> ] ensure:[UTF8TextConverter strictUtf8Conversions: strict].
>
> self assert: result = 'Grüß Gott'.
> !
>
> ----- Method: UTF8TextConverterTest>>testSqueakToUtf8 (in category 'tests')
> -----
> testSqueakToUtf8
> "Ensure proper encoding"
>
> self assert: '' squeakToUtf8 equals: ''.
> self assert: 'Hello World' squeakToUtf8 equals: 'Hello World'.
> self assert: 'Grüß Gott' squeakToUtf8 asByteArray
> equals: #[71 114 195 188 195 159 32 71 111 116 116]!
>
> ----- Method: UTF8TextConverterTest>>testStrictConversion (in category
> 'tests') -----
> testStrictConversion
> "Ensure the strict conversions do what they should"
>
> | strict |
> strict := UTF8TextConverter strictUtf8Conversions.
> [UTF8TextConverter strictUtf8Conversions: true.
> self should:[ 'Grüß Gott' utf8ToSqueak ] raise: Error.
> ] ensure:[UTF8TextConverter strictUtf8Conversions: strict].!
>
> ----- Method: UTF8TextConverterTest>>testUtf8ToSqueak (in category 'tests')
> -----
> testUtf8ToSqueak
> "Ensure proper encoding"
>
> self assert: '' utf8ToSqueak equals: ''.
> self assert: 'Hello World' utf8ToSqueak equals: 'Hello World'.
> self assert: #[71 114 195 188 195 159 32 71 111 116 116] asString
> utf8ToSqueak
> equals: 'Grüß Gott'
>
> !
>
>
>
More information about the Squeak-dev
mailing list
|