@@ -8,6 +8,7 @@ const common = require('../common');
8
8
const fs = require ( 'fs' ) ;
9
9
const { open, writeFile } = fs . promises ;
10
10
const path = require ( 'path' ) ;
11
+ const { Readable } = require ( 'stream' ) ;
11
12
const tmpdir = require ( '../common/tmpdir' ) ;
12
13
const assert = require ( 'assert' ) ;
13
14
const tmpDir = tmpdir . path ;
@@ -43,6 +44,126 @@ async function doWriteAndCancel() {
43
44
}
44
45
}
45
46
46
- validateWriteFile ( )
47
- . then ( doWriteAndCancel )
48
- . then ( common . mustCall ( ) ) ;
47
+ const dest = path . resolve ( tmpDir , 'tmp.txt' ) ;
48
+ const otherDest = path . resolve ( tmpDir , 'tmp-2.txt' ) ;
49
+ const stream = Readable . from ( [ 'a' , 'b' , 'c' ] ) ;
50
+ const stream2 = Readable . from ( [ 'ümlaut' , ' ' , 'sechzig' ] ) ;
51
+ const iterable = {
52
+ expected : 'abc' ,
53
+ * [ Symbol . iterator ] ( ) {
54
+ yield 'a' ;
55
+ yield 'b' ;
56
+ yield 'c' ;
57
+ }
58
+ } ;
59
+ function iterableWith ( value ) {
60
+ return {
61
+ * [ Symbol . iterator ] ( ) {
62
+ yield value ;
63
+ }
64
+ } ;
65
+ }
66
+ const bufferIterable = {
67
+ expected : 'abc' ,
68
+ * [ Symbol . iterator ] ( ) {
69
+ yield Buffer . from ( 'a' ) ;
70
+ yield Buffer . from ( 'b' ) ;
71
+ yield Buffer . from ( 'c' ) ;
72
+ }
73
+ } ;
74
+ const asyncIterable = {
75
+ expected : 'abc' ,
76
+ async * [ Symbol . asyncIterator ] ( ) {
77
+ yield 'a' ;
78
+ yield 'b' ;
79
+ yield 'c' ;
80
+ }
81
+ } ;
82
+
83
+ async function doWriteStream ( ) {
84
+ const fileHandle = await open ( dest , 'w+' ) ;
85
+ await fileHandle . writeFile ( stream ) ;
86
+ const expected = 'abc' ;
87
+ const data = fs . readFileSync ( dest , 'utf-8' ) ;
88
+ assert . deepStrictEqual ( data , expected ) ;
89
+ }
90
+
91
+ async function doWriteStreamWithCancel ( ) {
92
+ const controller = new AbortController ( ) ;
93
+ const { signal } = controller ;
94
+ process . nextTick ( ( ) => controller . abort ( ) ) ;
95
+ const fileHandle = await open ( otherDest , 'w+' ) ;
96
+ assert . rejects ( fileHandle . writeFile ( stream , { signal } ) , {
97
+ name : 'AbortError'
98
+ } ) ;
99
+ }
100
+
101
+ async function doWriteIterable ( ) {
102
+ const fileHandle = await open ( dest , 'w+' ) ;
103
+ await fileHandle . writeFile ( iterable ) ;
104
+ const data = fs . readFileSync ( dest , 'utf-8' ) ;
105
+ assert . deepStrictEqual ( data , iterable . expected ) ;
106
+ await fileHandle . close ( ) ;
107
+ }
108
+
109
+ async function doWriteInvalidIterable ( ) {
110
+ const fileHandle = await open ( dest , 'w+' ) ;
111
+ await Promise . all (
112
+ [ 42 , 42n , { } , Symbol ( '42' ) , true , undefined , null , NaN ] . map ( ( value ) =>
113
+ assert . rejects ( fileHandle . writeFile ( iterableWith ( value ) ) , {
114
+ code : 'ERR_INVALID_ARG_TYPE' ,
115
+ } )
116
+ )
117
+ ) ;
118
+ await fileHandle . close ( ) ;
119
+ }
120
+
121
+ async function doWriteIterableWithEncoding ( ) {
122
+ const fileHandle = await open ( dest , 'w+' ) ;
123
+ await fileHandle . writeFile ( stream2 , 'latin1' ) ;
124
+ const expected = 'ümlaut sechzig' ;
125
+ const data = fs . readFileSync ( dest , 'latin1' ) ;
126
+ assert . deepStrictEqual ( data , expected ) ;
127
+ await fileHandle . close ( ) ;
128
+ }
129
+
130
+ async function doWriteBufferIterable ( ) {
131
+ const fileHandle = await open ( dest , 'w+' ) ;
132
+ await fileHandle . writeFile ( bufferIterable ) ;
133
+ const data = fs . readFileSync ( dest , 'utf-8' ) ;
134
+ assert . deepStrictEqual ( data , bufferIterable . expected ) ;
135
+ await fileHandle . close ( ) ;
136
+ }
137
+
138
+ async function doWriteAsyncIterable ( ) {
139
+ const fileHandle = await open ( dest , 'w+' ) ;
140
+ await fileHandle . writeFile ( asyncIterable ) ;
141
+ const data = fs . readFileSync ( dest , 'utf-8' ) ;
142
+ assert . deepStrictEqual ( data , asyncIterable . expected ) ;
143
+ await fileHandle . close ( ) ;
144
+ }
145
+
146
+ async function doWriteInvalidValues ( ) {
147
+ const fileHandle = await open ( dest , 'w+' ) ;
148
+ await Promise . all (
149
+ [ 42 , 42n , { } , Symbol ( '42' ) , true , undefined , null , NaN ] . map ( ( value ) =>
150
+ assert . rejects ( fileHandle . writeFile ( value ) , {
151
+ code : 'ERR_INVALID_ARG_TYPE' ,
152
+ } )
153
+ )
154
+ ) ;
155
+ await fileHandle . close ( ) ;
156
+ }
157
+
158
+ ( async ( ) => {
159
+ await validateWriteFile ( ) ;
160
+ await doWriteAndCancel ( ) ;
161
+ await doWriteStream ( ) ;
162
+ await doWriteStreamWithCancel ( ) ;
163
+ await doWriteIterable ( ) ;
164
+ await doWriteInvalidIterable ( ) ;
165
+ await doWriteIterableWithEncoding ( ) ;
166
+ await doWriteBufferIterable ( ) ;
167
+ await doWriteAsyncIterable ( ) ;
168
+ await doWriteInvalidValues ( ) ;
169
+ } ) ( ) . then ( common . mustCall ( ) ) ;
0 commit comments