[squeak-dev] Squeak 4.6: MultilingualTests-fbs.18.mcz

H. Hirzel hannes.hirzel at gmail.com
Thu Jan 19 09:36:49 UTC 2017


On 1/19/17, Tobias Pape <Das.Linux at gmx.de> wrote:
>
> On 19.01.2017, at 07:57, H. Hirzel <hannes.hirzel at gmail.com> wrote:
>
>> 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?
>
> No, not yet…
> Also, fallback fonts do not really work like that, they only have exactly
> one glyph that is used when the
> falbackee (i mean the font in need of the fallback) says it does not have
> the glyph requested.
>
> ----------
> fallbackFont
> 	"Answers the fallbackFont for the receiver. The fallback font must be some
> derivative of the receiver since it will not be asked to install itself
> properly on the target BitBlt so rendering a completely different font here
> is simply not possible. The default implementation uses a synthetic font
> that maps all characters to question marks."
> 	^ fallbackFont
> 		ifNil: [fallbackFont := FixedFaceFont new errorFont baseFont: self]
> ----------
>
> But maybe we should change that.

Yes, I was not aware of this limited concept of 'fallback' font.

Why not create a glyph with 4 tiny hex digits on the fly, when requested?

A report on http://www.bgaertner.gmxhome.de/Sqm17n.htm gives details
about such a font

http://www.bgaertner.gmxhome.de/Squeak38ExperienceRep.zip

"Toy font"


> The better alternative is to have actual good glyph coverage ;)

Yes. A bitmap font with better glyph coverage is needed in  the image.
Or on SqueakMap.


> Best regards
> 	-Tobias
>
>>
>> --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