substreams/Xtreams__TestWriteSubstream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 01 Feb 2012 00:56:17 +0000
changeset 103 726bf2ca0b99
parent 67 a87e5ce04545
child 109 9587e2df7029
permissions -rw-r--r--
Removed methods from FileHandle to make it compilable. Having methods there is not a good idea anyway.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/substreams' }"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
WriteSubstream subclass:#TestWriteSubstream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'substreamAtEnd test inclusive'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:''
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     8
	poolDictionaries:''
22
e0653bbdbe61 added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 4
diff changeset
     9
	category:'Xtreams-Substreams'
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
TestWriteSubstream comment:'This is a substream bounded by an element matching the @test criteria.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
Instance Variables
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
	substreamAtEnd	<Boolean> is this substream at end
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
	test	<BlockClosure> the bounding criteria
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
	inclusive	<Boolean> is the boundary part of the substream contents
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
!TestWriteSubstream class methodsFor:'instance creation'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
on: aDestination test: testBlock inclusive: aBoolean
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
	^self new on: aDestination test: testBlock inclusive: aBoolean
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
!TestWriteSubstream methodsFor:'accessing'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
insert: anInteger from: aSequenceableCollection at: startIndex
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
	^self write: anInteger from: aSequenceableCollection at: startIndex
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
put: anObject
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
	substreamAtEnd ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
	((substreamAtEnd := test value: anObject) and: [inclusive not]) ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
	[destination put: anObject] on: Incomplete do: [:incomplete | destinationAtEnd := substreamAtEnd := true. incomplete pass].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	^anObject
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
write: anInteger from: aSequenceableCollection at: startIndex
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
	| count object |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
	substreamAtEnd ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
	count := 0.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
	[[count < anInteger and: [substreamAtEnd not]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
		[object := aSequenceableCollection at: startIndex + count.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
		((substreamAtEnd := test value: object) and: [inclusive not]) ifFalse: [destination put: object].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
		count := count + 1]]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
			on: Incomplete do: [:incomplete |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
				destinationAtEnd := substreamAtEnd := true.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
				(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
	count < anInteger ifTrue: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
	^anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
!TestWriteSubstream methodsFor:'initialize-release'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
on: aDestination test: testBlock inclusive: aBoolean
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
	self on: aDestination.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
	test := testBlock.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
	inclusive := aBoolean.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
	substreamAtEnd := false
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
!TestWriteSubstream methodsFor:'private'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
streamingInsert: anInteger from: aReadStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
	self streamingWrite: anInteger from: aReadStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
streamingInsertFrom: aReadStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
	self streamingWriteFrom: aReadStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
streamingWrite: anInteger from: aReadStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
	| count object |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
	substreamAtEnd ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
	count := 0.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
	[[count < anInteger and: [substreamAtEnd not]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
		[object := aReadStream get.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
		((substreamAtEnd := test value: object) and: [inclusive not]) ifFalse: [destination put: object].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
		count := count + 1]]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
			on: Incomplete do: [:incomplete |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
				destinationAtEnd := substreamAtEnd := true.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
				(Incomplete count: count) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
	count < anInteger ifTrue: [(Incomplete count: count) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
	^anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
streamingWriteFrom: aReadStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
	| object count |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
	substreamAtEnd ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
	count := 0.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
	^[[substreamAtEnd not] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    96
		[object := aReadStream get.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
		((substreamAtEnd := test value: object) and: [inclusive not]) ifFalse: [destination put: object. count := count + 1]].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
		count
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
	] on: Incomplete do: [:incomplete | destinationAtEnd := substreamAtEnd := true. count ]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
!TestWriteSubstream methodsFor:'testing'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
isPositionable
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
	^false
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
!TestWriteSubstream class methodsFor:'documentation'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
version_SVN
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
    ^ '$Id$'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
! !