Emberveil source

tests/NetworkSmoke.java

import java.net.InetAddress;
import java.nio.file.*;

/** Two independent real clients: visibility, movement, chat and custom interface. */
public class NetworkSmoke extends Game {
    static String username, peer;
    int phase, ticks, startX, startY;
    boolean sawPeer, sawChat, moved, journal, watchMenu, story;
    void command(String text) {
        stream.createFrame(103); stream.writeWordBigEndian(text.length()+1); stream.writeString(text);
    }
    void chat() {
        stream.createFrame(4); stream.writeWordBigEndian(0);
        int offset=stream.currentOffset;
        stream.method425(0); stream.method425(0);
        aStream_834.currentOffset=0;
        TextInput.method526("hello frontier",aStream_834);
        stream.method441(0,aStream_834.buffer,aStream_834.currentOffset);
        stream.writeBytes(stream.currentOffset-offset);
    }
    @Override public void processGameLoop() {
        if(phase==0) {
            phase=1; myUsername=username; myPassword="qa-local-unique";
            loginScreenState=2; login(myUsername,myPassword,false);
            if(!loggedIn) { System.err.println("FAIL login: "+loginMessage1+" "+loginMessage2); System.exit(1); }
        }
        super.processGameLoop();
        if(!loggedIn || loadingStage!=2) return;
        ticks++;
        for(Player p:playerArray) if(p!=null && p.name!=null && p.name.equalsIgnoreCase(peer)) sawPeer=true;
        for(String text:chatMessages) if(text!=null && text.toLowerCase().contains("hello frontier")) sawChat=true;
        if(ticks==100) { startX=myPlayer.smallX[0]; startY=myPlayer.smallY[0];
            doWalkTo(0,0,0,0,startY,0,0,startY,startX,true,startX+1); }
        if(ticks>100 && (myPlayer.smallX[0]!=startX || myPlayer.smallY[0]!=startY)) moved=true;
        if(ticks%100==0 && ticks<800) chat();
        if(ticks==800) command("journal");
        if(ticks>820 && openInterfaceID==8134) journal=true;
        if(ticks==900) command("watch");
        if(ticks==940) { stream.createFrame(40); stream.writeWord(4891); }
        if(ticks==980) watchMenu=backDialogID==2492;
        if(ticks==1000) { stream.createFrame(185); stream.writeWord(2494); }
        if(ticks>1050 && openInterfaceID==8134) {
            for(int id=8147;id<8196;id++) if(RSInterface.interfaceCache[id]!=null && RSInterface.interfaceCache[id].disabledText!=null && RSInterface.interfaceCache[id].disabledText.contains("Supplies for the watch")) story=true;
        }
        if(ticks==1200) {
            boolean pass=sawPeer&&sawChat&&moved&&journal&&watchMenu&&story;
            System.out.println((pass?"PASS":"FAIL")+" "+username+" visibility="+sawPeer+" chat="+sawChat+" movement="+moved+" journal="+journal+" watchMenu="+watchMenu+" story="+story);
            System.exit(pass?0:1);
        }
    }
    public static void main(String[] args) throws Exception {
        username=args[0]; peer=args[1];
        if(!username.matches("[a-z0-9 ]{1,12}") || !peer.matches("[a-z0-9 ]{1,12}")) throw new IllegalArgumentException();
        if(Files.exists(Paths.get("game/2006Scape Server/data/characters/"+username+".txt"))) throw new IllegalStateException("QA account already exists");
        ClientSettings.SERVER_IP="127.0.0.1"; ClientSettings.CHECK_CRC=false; ClientSettings.SHOW_NAVBAR=false;
        Game.nodeID=10; Game.portOff=0; Game.setHighMem(); Game.isMembers=true;
        Signlink.storeid=32; Signlink.startpriv(InetAddress.getLocalHost());
        new NetworkSmoke().createClientFrame(503,765);
        Thread timeout=new Thread(()->{try{Thread.sleep(90000);}catch(Exception ignored){} System.err.println("FAIL timeout"); System.exit(2);});
        timeout.setDaemon(true); timeout.start();
    }
}