Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


SSL xgap_test.g   Interaktion und
Portierbarkeitunbekannt

 
#############################################################################
##
#W  xgap_test.g               XGAP testing framework          Russ Woodroofe
##

## All globals are prefixed with XGT_

##
##  TL;DR:  Load this file, then perform XGT_Test(<cmd>) for a command <cmd> 
##  to be tested in an XGAP or Gap.app style environment.  
##
##  E.g.:
##    XGT_Test("Print(\"Hello world\");");
##

##
##  Global variables
## 
XGT_buf:="";
XGT_inputmode:=false;

##
## Constant storing the @w code queries sent by the XGAP library on startup,
## together with appropriate responses.  (The responses match those sent by
## Gap.app 0.61, but for most purposes, the specifics shouldn't matter.)
##
## Structure: list of pairs.  
##   1st entry: query sent by XGAP library
##   2nd entry: response to send back
##
## Queries:
##   3+XCN is asking for the number of colors supported.  (Generally, 2 or 5.)
##   6+XFI lines are asking for metrics of a fixed-spacing font in five sizes
##
XGT_wcode_responses:=[
  ["3+XCN","@a6+I0+I4+"],
  ["6+XFII1+","@a21+I0+I7+I3+I6+"],
  ["6+XFII2+","@a21+I0+I9+I3+I7+"],
  ["6+XFII3+","@a31+I0+I11+I4+I9+"],
  ["6+XFII4+","@a41+I0+I21+I4+I01+"],
  ["6+XFII5+","@a41+I0+I51+I5+I31+"]];;

##
#F  XGT_ParseChunk( <stream> )
##  
##  Parse input from "GAP -p" instance up to next @ special code, if any
##

XGT_ParseChunk:=function(stream)
  local atpos, retstr, codechar, pluspos, i;

  atpos:=Position(XGT_buf, '@');
  if atpos = fail then
    retstr:=ShallowCopy(XGT_buf);
    XGT_buf:="";
    return retstr;
  elif atpos > 1 then
    retstr:=XGT_buf{[1..atpos-1]};
    XGT_buf:=XGT_buf{[atpos..Length(XGT_buf)]};
    return retstr;
  fi;
  # So, atpos=1
  if Length(XGT_buf) < 2 then
    Info(InfoWarning, 1, "Unexpected @ code end");
    return fail;
  fi;
  codechar:=XGT_buf[2];
  XGT_buf:=XGT_buf{[3..Length(XGT_buf)]};
  if codechar = '@' then
    return "@";
  elif codechar = 'J' then
    return "\n";
  elif codechar = 'n' then
    #normal output, no action needed
    return "";
  elif codechar = 'r' then
    #input line, no action needed
    return "";
  elif (codechar >= '!' and codechar <= '&') or
       (codechar >= '1' and codechar <= '6') then
    # if we have a woefully underful buffer, try to get more
    if Length(XGT_buf) <= 3 then
      Append(XGT_buf, ReadLine(stream));
    fi;
    pluspos:=Position(XGT_buf, '+');
    if pluspos = fail then
      Info(InfoWarning, 1, "Badly formed garbage collection command");
      return fail;
    fi;
    XGT_buf:=XGT_buf{[pluspos+1..Length(XGT_buf)]};
    return "";
  elif codechar = 'i' then
    XGT_inputmode:=true;
    return "";
  elif codechar = 'e' then
    XGT_inputmode:=fail;
    return "";
  elif codechar = 'w' then
    # if we have a woefully underful buffer, try to get more
    if Length(XGT_buf) <= 3 then
      Append(XGT_buf, ReadLine(stream));
    fi;
    for i in [1..Length(XGT_wcode_responses)] do
      if StartsWith(XGT_buf, XGT_wcode_responses[i][1]) then
        WriteAll(stream, XGT_wcode_responses[i][2]);
        XGT_buf:=XGT_buf{[Length(XGT_wcode_responses[i][1])+1..Length(XGT_buf)]};
        return "";
      fi;
    od;
    Info(InfoWarning, 1, "Unimplemented @w code query @w", XGT_buf);
    return "@w";
  else
    return Flat(["[@", [codechar], "]"]);
  fi;
end;

##
#F  XGT_ParseUntilInput( <stream> )
##  
##  Parse input from "GAP -p" instance until the instance enters either
##  input mode, or error mode
##
XGT_ParseUntilInput:=function(stream)
  while XGT_inputmode = false do
    Append(XGT_buf, ReadLine(stream));
    while not IsEmpty(XGT_buf) do
      Print(XGT_ParseChunk(stream),"\c");
    od;
  od;
end;

##
#F  XGT_Test( <cmd> )
##  
##  Start up "GAP -p" instance, running GAP in the package mode ("XGAP mode").
##  Parse XGAP commands, and give canned responses to some basic queries.
##  Once "GAP -p" instance is ready for input, issue a single command, then
##  wait for the instance to be ready for input (or error input again).
##  Close stream (which should close the child "GAP -p" instance) at that
##  point.
##
XGT_Test:=function(cmd)
  local GAP_cmd, GAP_dir, stream, mycmd;

  GAP_cmd := Filename(DirectoriesLibrary(""), "gap");
  GAP_dir := DirectoryCurrent();

  XGT_buf:="";
  XGT_inputmode:=false;

  Print("Running GAP in package mode for command:  ", cmd, "\n\n");

  stream := InputOutputLocalProcess(GAP_dir,GAP_cmd,["-p"]);

  if ReadLine(stream) <> "@p1." then
    Info(InfoWarning, 1, "Failed acknowledgement from GAP package mode");
    CloseStream(stream);
    return fail;
  fi;

  XGT_ParseUntilInput(stream);

  WriteAll(stream, cmd);
  WriteAll(stream, "\n");
  XGT_inputmode:=false;

  XGT_ParseUntilInput(stream);

  CloseStream(stream);
end;


[ Verzeichnis aufwärts0.28unsichere Verbindung  Übersetzung europäischer Sprachen durch Browser  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge