00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.gui.log;
00023
00024 import java.awt.Font;
00025 import java.awt.FontFormatException;
00026 import java.awt.Graphics2D;
00027 import java.awt.GraphicsConfiguration;
00028 import java.awt.GraphicsDevice;
00029 import java.awt.GraphicsEnvironment;
00030 import java.awt.Transparency;
00031 import java.awt.image.BufferedImage;
00032 import java.io.FileInputStream;
00033 import java.io.IOException;
00034 import java.util.List;
00035 import org.jetbrains.annotations.NotNull;
00036 import org.junit.Assert;
00037 import org.junit.Test;
00038
00044 public class RenderStateTest {
00045
00049 private static final int HEIGHT = 104;
00050
00054 @Test
00055 public void test1() {
00056 if (GraphicsEnvironment.isHeadless()) {
00057 return;
00058 }
00059
00060 final Rec rec = new Rec();
00061 final Parser parser = new Parser();
00062
00063 for (int i = 0; i < HEIGHT+10; i++) {
00064 parser.parse("xxx"+i, null, rec.buffer);
00065 }
00066 rec.checkState(101, 0);
00067
00068
00069 rec.scrollTo(0);
00070 rec.checkState(0, 0);
00071 rec.scrollTo(5*Buffer.MIN_LINE_HEIGHT+3);
00072 rec.checkState(5, 3);
00073 rec.scrollTo(10*Buffer.MIN_LINE_HEIGHT);
00074 rec.checkState(10, 0);
00075
00076
00077 rec.scrollTo(-1);
00078 rec.checkState(0, 0);
00079 rec.scrollTo(-10);
00080 rec.checkState(0, 0);
00081
00082
00083 rec.scrollTo(97*Buffer.MIN_LINE_HEIGHT-1);
00084 rec.checkState(96, Buffer.MIN_LINE_HEIGHT-1);
00085 rec.scrollTo(111*Buffer.MIN_LINE_HEIGHT);
00086 rec.checkState(101, 0);
00087 }
00088
00092 @Test
00093 public void test2() {
00094 if (GraphicsEnvironment.isHeadless()) {
00095 return;
00096 }
00097
00098 final Rec rec = new Rec();
00099 final Parser parser = new Parser();
00100
00101 Assert.assertEquals(0, HEIGHT%Buffer.MIN_LINE_HEIGHT);
00102
00103 rec.checkState(0, 0);
00104 parser.parse("xxx1", null, rec.buffer);
00105 rec.checkState(0, 0);
00106 parser.parse("xxx2", null, rec.buffer);
00107 rec.checkState(0, 0);
00108
00109
00110 for (int i = 2; i < HEIGHT/Buffer.MIN_LINE_HEIGHT; i++) {
00111 parser.parse("xxx3"+i, null, rec.buffer);
00112 }
00113 rec.checkState(0, 0);
00114
00115
00116 parser.parse("xxx4", null, rec.buffer);
00117 rec.checkState(1, 0);
00118
00119
00120 parser.parse("xxx5", null, rec.buffer);
00121 rec.checkState(2, 0);
00122
00123
00124 rec.scrollTo(Buffer.MIN_LINE_HEIGHT);
00125 rec.checkState(1, 0);
00126
00127
00128 parser.parse("xxx6", null, rec.buffer);
00129 rec.checkState(1, 0);
00130
00131
00132 rec.scrollTo(3*Buffer.MIN_LINE_HEIGHT);
00133 rec.checkState(3, 0);
00134
00135
00136 parser.parse("xxx7", null, rec.buffer);
00137 rec.checkState(4, 0);
00138
00139
00140 for (int i = HEIGHT/Buffer.MIN_LINE_HEIGHT+4; i < Buffer.MAX_LINES; i++) {
00141 parser.parse("xxx8"+i, null, rec.buffer);
00142 }
00143 rec.checkState(Buffer.MAX_LINES-HEIGHT/Buffer.MIN_LINE_HEIGHT, 0);
00144
00145
00146 parser.parse("xxx9", null, rec.buffer);
00147 rec.checkState(Buffer.MAX_LINES-HEIGHT/Buffer.MIN_LINE_HEIGHT, 0);
00148
00149
00150 rec.scrollTo(Buffer.MAX_LINES*Buffer.MIN_LINE_HEIGHT-HEIGHT-Buffer.MIN_LINE_HEIGHT);
00151 rec.checkState(Buffer.MAX_LINES-HEIGHT/Buffer.MIN_LINE_HEIGHT-1, 0);
00152
00153
00154 for (int i = 0; i < Buffer.MAX_LINES-HEIGHT/Buffer.MIN_LINE_HEIGHT-2; i++) {
00155 parser.parse("xxx0"+i, null, rec.buffer);
00156 }
00157 rec.checkState(1, 0);
00158 parser.parse("xxx1", null, rec.buffer);
00159 rec.checkState(0, 0);
00160
00161
00162 parser.parse("xxx2", null, rec.buffer);
00163 rec.checkState(0, 0);
00164 }
00165
00169 private static class Rec {
00170
00174 @NotNull
00175 private final RenderState rs;
00176
00180 @NotNull
00181 private final Buffer buffer;
00182
00186 private Rec() {
00187 final GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
00188 final GraphicsDevice graphicsDevice = graphicsEnvironment.getDefaultScreenDevice();
00189 final GraphicsConfiguration graphicsConfiguration = graphicsDevice.getDefaultConfiguration();
00190 final BufferedImage image = graphicsConfiguration.createCompatibleImage(1, 1, Transparency.TRANSLUCENT);
00191 final Graphics2D g = image.createGraphics();
00192 final Font font;
00193 try {
00194 final FileInputStream fis = new FileInputStream("skins/ragnorok/fonts/regular.ttf");
00195 try {
00196 try {
00197 font = Font.createFont(Font.TRUETYPE_FONT, fis);
00198 } catch (final FontFormatException ex) {
00199 Assert.fail();
00200 throw new AssertionError(ex);
00201 }
00202 } finally {
00203 fis.close();
00204 }
00205 } catch (final IOException ex) {
00206 Assert.fail();
00207 throw new AssertionError(ex);
00208 }
00209 buffer = new Buffer(new Fonts(font, font, font, font), g.getFontRenderContext(), 100);
00210 g.dispose();
00211 rs = new RenderState();
00212 assert buffer != null;
00213 rs.setHeight(buffer, HEIGHT);
00214
00215 final BufferListener bufferListener = new BufferListener() {
00216
00217 @Override
00218 public void lineAdded() {
00219 assert rs != null;
00220 assert buffer != null;
00221 rs.linesAdded(buffer);
00222 }
00223
00224 @Override
00225 public void lineReplaced() {
00226 assert rs != null;
00227 assert buffer != null;
00228 rs.linesReplaced(buffer);
00229 }
00230
00231 @Override
00232 public void linesRemoved(@NotNull final List<Line> lines) {
00233 assert rs != null;
00234 assert buffer != null;
00235 rs.linesRemoved(buffer, lines);
00236 }
00237
00238 };
00239 assert buffer != null;
00240 buffer.addBufferListener(bufferListener);
00241 }
00242
00247 public void scrollTo(final int y) {
00248 rs.scrollTo(buffer, y);
00249 }
00250
00257 public void checkState(final int expectedTopIndex, final int expectedTopOffset) {
00258 final int expectedScrollPos = expectedTopIndex*Buffer.MIN_LINE_HEIGHT+expectedTopOffset;
00259 final int topIndex = rs.getTopIndex();
00260 final int topOffset = rs.getTopOffset();
00261 final int scrollPos = rs.getScrollPos();
00262 Assert.assertEquals(formatState(expectedTopIndex, expectedTopOffset, expectedScrollPos), formatState(topIndex, topOffset, scrollPos));
00263 }
00264
00272 @NotNull
00273 public String formatState(final int topIndex, final int topOffset, final int scrollPos) {
00274 return "top="+topIndex+"/"+topOffset+" pos="+scrollPos+"/"+buffer.getTotalHeight();
00275 }
00276
00277 }
00278
00279 }