RegressionTests__BinaryIOTests.st
author Claus Gittinger <cg@exept.de>
Thu, 10 Mar 2016 15:44:12 +0100
changeset 1346 8a5f1174bed3
parent 1345 e890cf9dd4cd
child 1349 41a9f2291eec
permissions -rw-r--r--
#DOCUMENTATION class: RegressionTests::BinaryIOTests category change

"{ Package: 'exept:regression' }"

"{ NameSpace: RegressionTests }"

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

!BinaryIOTests class methodsFor:'documentation'!

documentation
"
    documentation to be added.

    [author:]
        Claus Gittinger (cg@alan)

    [instance variables:]

    [class variables:]

    [see also:]

"
!

history
    "Created: / 09-09-2004 / 13:13:39 / cg"
! !

!BinaryIOTests methodsFor:'initialize / release'!

setUp
    "common setup - invoked before testing."

    super setUp
!

tearDown
    "common cleanup - invoked after testing."

    super tearDown
! !

!BinaryIOTests methodsFor:'tests'!

test1
    |test test2 loaders bytes outStream inStream|

    loaders := OrderedCollection new.

    outStream := ByteArray new writeStream.

    test := [:objWritten |
                objWritten storeBinaryOn:outStream.
                loaders add:[ 
                                    |objRead expected|

                                    expected := objWritten.
                                    objRead := inStream nextObject.
                                    self assert:( objRead = expected ) 
                                 ]
              ].

    test2 := [:val | test value:val. test value:  val negated].

    test value:(1 to:99).
    test value:(1 to:99) asArray.
    test value:(1 to:99) asArray beImmutable.

    bytes := outStream contents.
    inStream := BinaryInputManager on:bytes readStream.

    loaders do:[:action | action value ].

    "
     self run:#test1
     self new test1
    "
!

testArrays1
    |objs outStream inStream|

    outStream := ByteArray new writeStream.

    objs := #(
        ()
        (1)
        (1 2)
        (1 2 3)
        (nil true false 1 1.0)
    ).

    objs do:[:written |
        written storeBinaryOn:outStream.
    ].


    inStream := BinaryInputManager on:(outStream contents readStream).

    objs do:[:expected | |read|
        read := inStream nextObject.
        self assert:( read = expected).
    ].

    "
     self run:#testArrays1
     self new testArrays1
    "
!

testByteArrays1
    |objs outStream inStream|

    outStream := ByteArray new writeStream.

    objs := #(
        []
        [1]
        [1 2]
        [1 2 3]
    ).

    objs do:[:written |
        written storeBinaryOn:outStream.
    ].


    inStream := BinaryInputManager on:(outStream contents readStream).

    objs do:[:expected | |read|
        read := inStream nextObject.
        self assert:( read = expected).
    ].

    "
     self run:#testByteArrays1
     self new testByteArrays1
    "
!

testByteArrays2
    |outStream inStream test|

    test := [:obj |
        |written read|

        outStream := ByteArray new writeStream.
        written := obj.
        written storeBinaryOn:outStream.

        inStream := BinaryInputManager on:(outStream contents readStream).

        read := inStream nextObject.
        self assert:( read = written).
    ].

    test value:(1 to:254) asByteArray.
    test value:(1 to:255) asByteArray.
    test value:(0 to:255) asByteArray.

    test value:(ByteArray new:100).
    test value:(ByteArray new:127).
    test value:(ByteArray new:128).
    test value:(ByteArray new:129).
    test value:(ByteArray new:254).
    test value:(ByteArray new:255).
    test value:(ByteArray new:256).
    test value:(ByteArray new:257).
    test value:(ByteArray new:1000).
    test value:(ByteArray new:10000).
    test value:(ByteArray new:100000).
    test value:(ByteArray new:1000000).
    test value:(ByteArray new:10000000).

    test value:(ByteArray new:1000) beImmutable.


    "
     self run:#testByteArrays2
     self new testByteArrays2
    "
!

testIntegers1
    |nums outStream bytes inStream verbose|

    verbose := false.

    outStream := ByteArray new writeStream.

    nums := #(
        0
        1
        127
        128
        129
        254 
        255 
        256 
        16r0FFF 
        16r1000 
        16r1001 
        16r1FFF 
        16r2000 
        16r2001 
        16r3FFF 
        16r4000 
        16r4001 
        16r7FFF 
        16r8000 
        16r8001 
        16rFFFF 
        16r10000 
        16r10001 

        16r3FFFFF 
        16r400000 
        16r400001 
        16r7FFFFF 
        16r800000 
        16r800001 
        16rFFFFFF 
        16r1000000 
        16r1000001 

        16r3FFFFFFF 
        16r40000000 
        16r40000001 
        16r7FFFFFFF 
        16r80000000 
        16r80000001
        16rFFFFFFFF 
        16r100000000 
        16r100000001 

        16r3FFFFFFFFF 
        16r4000000000 
        16r4000000001 
        16r7FFFFFFFFF 
        16r8000000000 
        16r8000000001 
        16rFFFFFFFFFF 
        16r10000000000 
        16r10000000001 

        16r3FFFFFFFFFFF 
        16r400000000000 
        16r400000000001 
        16r7FFFFFFFFFFF 
        16r800000000000 
        16r800000000001 
        16rFFFFFFFFFFFF 
        16r1000000000000 
        16r1000000000001 

        16r3FFFFFFFFFFFFF 
        16r40000000000000 
        16r40000000000001 
        16r7FFFFFFFFFFFFF 
        16r80000000000000 
        16r80000000000001 
        16rFFFFFFFFFFFFFF 
        16r100000000000000 
        16r100000000000001 

        16r3FFFFFFFFFFFFFFF            
        16r4000000000000000 
        16r4000000000000001 
        16r7FFFFFFFFFFFFFFF 
        16r8000000000000000 
        16r8000000000000001 
        16rFFFFFFFFFFFFFFFF 
        16r10000000000000000 
        16r10000000000000001 

        16r3FFFFFFFFFFFFFFFFF 
        16r400000000000000000 
        16r400000000000000001 
        16r7FFFFFFFFFFFFFFFFF 
        16r800000000000000000 
        16r800000000000000001 
        16rFFFFFFFFFFFFFFFFFF 
        16r1000000000000000000 
        16r1000000000000000001 

        16r3FFFFFFFFFFFFFFFFFFF 
        16r40000000000000000000 
        16r40000000000000000001 
        16r7FFFFFFFFFFFFFFFFFFF 
        16r80000000000000000000 
        16r80000000000000000001 
        16rFFFFFFFFFFFFFFFFFFFF 
        16r100000000000000000000 
        16r100000000000000000001 

        16r7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 
        16r80000000000000000000000000000000000000 
        16rFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 
    ).

    nums do:[:written |
        |bytes read|

        bytes := written binaryStoreBytes.
        verbose ifTrue:[
            Transcript show:written.
            Transcript show:' -> '.
            Transcript showCR:bytes.
        ].
        read := Object fromBinaryStoreBytes:bytes.
        self assert:(read = written).
    ].

    nums do:[:written |
        |bytes read|

        bytes := written negated binaryStoreBytes.
        verbose ifTrue:[
            Transcript show:written.
            Transcript show:' -> '.
            Transcript showCR:bytes.
        ].
        read := Object fromBinaryStoreBytes:bytes.
        self assert:(read = written negated).
    ].

    nums do:[:written |
        written storeBinaryOn:outStream.
        written negated storeBinaryOn:outStream.
    ].

    bytes := outStream contents.
    inStream := BinaryInputManager on:(bytes readStream).

    nums do:[:expected | |read|
        read := inStream nextObject.
        self assert:( read = expected).

        read := inStream nextObject.
        self assert:( read = expected negated).

    ].

    "
     self run:#testIntegers1
     self new testIntegers1
    "

    "Modified: / 10-01-2012 / 19:23:44 / cg"
!

testOrderedCollection1
    |o rw|

    rw := [:obj |
        |read outStream inStream|

        outStream := ByteArray new writeStream.

        obj storeBinaryOn:outStream.

        inStream := BinaryInputManager on:(outStream contents readStream).
        read := inStream nextObject.
        self assert:( read = obj).
    ].

    o := OrderedCollection new.
    rw value:o.

    o add:1.
    rw value:o.

    o add:2.
    rw value:o.

    o add:#().
    rw value:o.

    o add:#(1 2 3).
    rw value:o.

    "
     self run:#testOrderedCollection1
     self new testOrderedCollection1
    "
!

testSaveReadBOS

    |objStored childStored childrenStored objLoaded childrenLoaded childLoaded 
     fn bos privateClass didConvert verbose|

    verbose := false.
    verbose := true.
    
    Class withoutUpdatingChangesDo:[
        HierarchicalItem subclass:#XHierarchicalItem
            instanceVariableNames:''
            classVariableNames:''
            poolDictionaries:''
            category:'Views-Support'.

        privateClass := Smalltalk at:#XHierarchicalItem.
    ].

    objStored := privateClass  new.
    childStored := privateClass new.
    objStored add: childStored.
    childStored instVarNamed:#width put:privateClass.

    self assert:(objStored hasChildren).
    self assert:(objStored children size == 1).
    self assert:(objStored children first == childStored).
    
    "/ fn := '/tmp/HI' asFilename.
    fn := Filename newTemporary.
    bos :=  BinaryObjectStorage onNew: (fn writeStream).
    bos nextPut: objStored.

    verbose ifTrue:[
        Transcript showCR:'object saved:'.
        "/ obj inspect.
        ObjectMemory dumpObject:objStored.
    ].    
    bos close.

    didConvert := false.

    "/ now, change the class (stored object is old)
    Class withoutUpdatingChangesDo:[
        verbose ifTrue:[
            Transcript showCR:'changing the class (add a slot)...'.
        ].    
        privateClass addInstVarName:'foo'.
        verbose ifTrue:[
            Transcript showCR:'done.'.
        ].    
    ].

    bos := BinaryObjectStorage onOld: fn readStream.
    BinaryIOManager requestConversionSignal handle:[:ex|
        | oldObject newClass |

        newClass := ex parameter key.
        oldObject := ex parameter value.
        verbose ifTrue:[
            Transcript showCR: 'converting...'.
        ].    
        didConvert := true.
        ex proceedWith: (newClass cloneFrom: oldObject).
    ] do:[
        BinaryIOManager invalidClassSignal handle:[:ex2|
            | oldClass newClass proceedClass |

            newClass := Smalltalk at: ex2 parameter name asSymbol.
            oldClass := ex2 parameter.

            verbose ifTrue:[
                Transcript showCR: 'will convert instance of ',oldClass name.
            ].    
            proceedClass :=(((newClass isSubclassOf: HierarchicalItem) or:[newClass == HierarchicalItem]) ifTrue:[newClass] ifFalse:[oldClass]).
            ex2 proceedWith: proceedClass.
        ] do:[
            objLoaded := bos next.
            verbose ifTrue:[
                "/ obj inspect.
                Transcript showCR:'object restored (new class):'.
                ObjectMemory dumpObject:objLoaded.
            ].    
        ].
    ].

    self assert:(didConvert).
    self assert:(objLoaded class instSize == (HierarchicalItem instSize + 1)).

    self assert:(objLoaded hasChildren).
    self assert:(objLoaded children size == 1).
    self assert:(objLoaded children == (objLoaded instVarNamed:#children) ).

    "Created: / 26-09-2007 / 18:21:11 / cg"
    "Modified: / 07-08-2011 / 15:29:35 / cg"
!

testStrings1
    |objs outStream inStream|

    outStream := ByteArray new writeStream.

    objs := #(
        ''
        '1'
        '12'
        '123'
        "/        1         2         3         4         5         6         7         8         9         0         1         2
        '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678'

        "/        1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5
        '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345'

        "/        1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5
        '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456'

        "/        1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5
        '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567'
    ).

    objs do:[:written |
        written storeBinaryOn:outStream.
    ].


    inStream := BinaryInputManager on:(outStream contents readStream).

    objs do:[:expected | |read|
        read := inStream nextObject.
        self assert:( read = expected).
    ].

    "
     self run:#testStrings1
     self new testStrings1
    "
!

testStrings2
    |outStream inStream test|

    test := [:obj |
        |written read|

        outStream := ByteArray new writeStream.
        written := obj.
        written storeBinaryOn:outStream.

        inStream := BinaryInputManager on:(outStream contents readStream).

        read := inStream nextObject.
        self assert:( read = written).
    ].

    test value:(String new:100).
    test value:(String new:127).
    test value:(String new:128).
    test value:(String new:129).
    test value:(String new:254).
    test value:(String new:255).
    test value:(String new:256).
    test value:(String new:257).
    test value:(String new:1000).
    test value:(String new:10000).
    test value:(String new:100000).
    test value:(String new:1000000).
    test value:(String new:10000000).

    test value:(ImmutableString new:1000).


    "
     self run:#testStrings2
     self new testStrings2
    "
!

test_store_retrieve_string_and_array_01
    |original retrieved hello inStream outStream|

    hello := 'hello'.
    original := Array with:hello with:hello.

    [
        outStream := 'data.bos' asFilename writeStream binary.
        original storeBinaryOn:outStream.
        outStream close.

        inStream := 'data.bos' asFilename readStream binary.
        retrieved := Object readBinaryFrom:inStream.
        inStream close.
    ] ensure:[
        'data.bos' asFilename delete
    ].

    self assert:( (original at:1) == (original at:2) ).         "must be identical"
    self assert:( (retrieved at:1) == (retrieved at:2) ).       "must be identical"

    "
     self new test01_store_retrieve_string_and_array_01
    "
! !

!BinaryIOTests class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !