/* * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/* @test * @summary Stochastic test of charset-based streams * @key randomness
*/
privateint check(byte[] ba, int off, int len) throws IOException {
String s = new String(ba, off, len, csn); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); char d = cg.next(); if (c != d) { if (c == '?') { if (Character.isHighSurrogate(d))
cg.next(); continue;
}
mismatch(csn, count + i, c, d);
}
}
count += n; return len;
}
publicvoid write(byte[] ba, int off, int len) throws IOException {
check(ba, off, len);
}
publicint write(ByteBuffer bb) throws IOException { int n = check(bb.array(),
bb.arrayOffset() + bb.position(),
bb.remaining());
bb.position(bb.position() + n); return n;
}
publicvoid close() {
count = -1;
}
publicboolean isOpen() { return count >= 0;
}
}
staticvoid testWrite(String csn, int limit, long seed, Writer w) throws IOException
{
Random rand = new Random(seed);
CharacterGenerator cg = new CharacterGenerator(seed, csn,
Integer.MAX_VALUE); int count = 0; char[] ca = newchar[16384];
int n = 0; while (count < limit) {
n = rand.nextInt(ca.length); for (int i = 0; i < n; i++)
ca[i] = cg.next();
w.write(ca, 0, n);
count += n;
} if (Character.isHighSurrogate(ca[n - 1]))
w.write(cg.next());
w.close();
}
staticvoid testStreamWrite(String csn, int limit, long seed) throws IOException
{
log.println(" write stream");
testWrite(csn, limit, seed, new OutputStreamWriter(new Sink(csn, seed), csn));
}
publicint read(byte[] ba, int off, int len) throws IOException { if (!cg.hasNext()) return -1; int end = off + len; int i = off; while (i < end) { if ((bb == null) || !bb.hasRemaining()) {
cb.clear(); while (cb.hasRemaining()) { if (!cg.hasNext()) break; char c = cg.next(); if (Character.isHighSurrogate(c)
&& cb.remaining() == 1) {
cg.push(c); break;
}
cb.put(c);
}
cb.flip(); if (!cb.hasRemaining()) break;
bb = enc.encode(cb);
} int d = Math.min(bb.remaining(), end - i);
bb.get(ba, i, d);
i += d;
} return i - off;
}
publicint read(ByteBuffer bb) throws IOException { int n = read(bb.array(),
bb.arrayOffset() + bb.position(),
bb.remaining()); if (n >= 0)
bb.position(bb.position() + n); return n;
}
publicvoid close() {
count = -1;
}
publicboolean isOpen() { return count != -1;
}
}
staticvoid testRead(String csn, int limit, long seed, int max,
Reader rd) throws IOException
{
Random rand = new Random(seed);
CharacterGenerator cg = new CharacterGenerator(seed, csn, limit); int count = 0; char[] ca = newchar[16384];
int n = 0; while (count < limit) { int rn = rand.nextInt(ca.length);
n = rd.read(ca, 0, rn); if (n < 0) break; for (int i = 0; i < n; i++) { char c = ca[i]; if (!cg.hasNext())
mismatchedEOF(csn, count + i, cg.count()); char d = cg.next(); if (c == '?') { if (Character.isHighSurrogate(d)) {
cg.next(); continue;
} if (d > max) continue;
} if (c != d)
mismatch(csn, count + i, c, d);
}
count += n;
} if (cg.hasNext())
mismatchedEOF(csn, count, cg.count());
rd.close();
}
staticvoid testStreamRead(String csn, int limit, long seed, int max) throws IOException
{
log.println(" read stream");
testRead(csn, limit, seed, max, new InputStreamReader(new Source(csn, seed, limit), csn));
}
staticvoid testChannelRead(String csn, int limit, long seed, int max) throws IOException
{
log.println(" read channel");
testRead(csn, limit, seed, max,
Channels.newReader(new Source(csn, seed, limit), csn));
}
staticfinalint LIMIT = 1 << 21;
staticvoid test(String csn, int limit, long seed, int max) throws Exception
{
log.println();
log.println(csn);
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.