/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// The string we use as data. const data = "0123456789"; // Number of streams in the multiplex stream. const count = 10;
function test_multiplex_streams() { var MultiplexStream = CC( "@mozilla.org/io/multiplex-input-stream;1", "nsIMultiplexInputStream"
); Assert.equal(1, 1);
var multiplex = new MultiplexStream(); for (var i = 0; i < count; ++i) {
let s = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
Ci.nsIStringInputStream
);
s.setByteStringData(data);
multiplex.appendStream(s);
} var seekable = multiplex.QueryInterface(Ci.nsISeekableStream); var sis = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(
Ci.nsIScriptableInputStream
);
sis.init(seekable); // Read some data. var readData = sis.read(20); Assert.equal(readData, data + data); // -- Tests for NS_SEEK_SET // Seek to a non-zero, non-stream-boundary offset.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 2); Assert.equal(seekable.tell(), 2); Assert.equal(seekable.available(), 98);
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 9); Assert.equal(seekable.tell(), 9); Assert.equal(seekable.available(), 91); // Seek across stream boundary.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 35); Assert.equal(seekable.tell(), 35); Assert.equal(seekable.available(), 65);
readData = sis.read(5); Assert.equal(readData, data.slice(5)); Assert.equal(seekable.available(), 60); // Seek at stream boundaries.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 40); Assert.equal(seekable.tell(), 40); Assert.equal(seekable.available(), 60);
readData = sis.read(10); Assert.equal(readData, data); Assert.equal(seekable.tell(), 50); Assert.equal(seekable.available(), 50); // Rewind and read across streams.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 39); Assert.equal(seekable.tell(), 39); Assert.equal(seekable.available(), 61);
readData = sis.read(11); Assert.equal(readData, data.slice(9) + data); Assert.equal(seekable.tell(), 50); Assert.equal(seekable.available(), 50); // Rewind to the beginning.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); Assert.equal(seekable.tell(), 0); Assert.equal(seekable.available(), 100); // Seek to some random location
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 50); // -- Tests for NS_SEEK_CUR // Positive seek.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_CUR, 15); Assert.equal(seekable.tell(), 65); Assert.equal(seekable.available(), 35);
readData = sis.read(10); Assert.equal(readData, data.slice(5) + data.slice(0, 5)); Assert.equal(seekable.tell(), 75); Assert.equal(seekable.available(), 25); // Negative seek.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_CUR, -15); Assert.equal(seekable.tell(), 60); Assert.equal(seekable.available(), 40);
readData = sis.read(10); Assert.equal(readData, data); Assert.equal(seekable.tell(), 70); Assert.equal(seekable.available(), 30);
// -- Try to do various edge cases // Forward seek from the end, should throw. var caught = false; try {
seekable.seek(Ci.nsISeekableStream.NS_SEEK_END, 15);
} catch (e) {
caught = true;
} Assert.equal(caught, true); Assert.equal(seekable.tell(), data.length * count); // Backward seek from the beginning, should be clamped.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); Assert.equal(seekable.tell(), 0);
seekable.seek(Ci.nsISeekableStream.NS_SEEK_CUR, -15); Assert.equal(seekable.tell(), 0); // Seek too far: should be clamped.
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); Assert.equal(seekable.tell(), 0);
seekable.seek(Ci.nsISeekableStream.NS_SEEK_CUR, 3 * data.length * count); Assert.equal(seekable.tell(), 100);
seekable.seek(Ci.nsISeekableStream.NS_SEEK_SET, data.length * count); Assert.equal(seekable.tell(), 100);
seekable.seek(Ci.nsISeekableStream.NS_SEEK_CUR, -2 * data.length * count); Assert.equal(seekable.tell(), 0);
}
function test_multiplex_bug797871() { var data2 = "1234567890123456789012345678901234567890";
var MultiplexStream = CC( "@mozilla.org/io/multiplex-input-stream;1", "nsIMultiplexInputStream"
); Assert.equal(1, 1);
var multiplex = new MultiplexStream();
let s = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
Ci.nsIStringInputStream
);
s.setByteStringData(data2);
multiplex.appendStream(s);
var seekable = multiplex.QueryInterface(Ci.nsISeekableStream); var sis = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(
Ci.nsIScriptableInputStream
);
sis.init(seekable);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.