######################################################################
#
# File: tests.txt
# Purpose: This is a series of tests for the ClassAd library. 
#          Currently there is no good documentation for how to write
#          tests, you'll just have to look in test_classads.C
#
######################################################################

######################################################################
#
# Test the lexer
#
######################################################################
test-lexer-one-token    123    LEX_INTEGER_VALUE
test-lexer-one-token 123.456 LEX_REAL_VALUE
test-lexer-one-token true LEX_BOOLEAN_VALUE
test-lexer-one-token false LEX_BOOLEAN_VALUE
test-lexer-one-token "blah" LEX_STRING_VALUE
test-lexer-one-token "new\nline" LEX_STRING_VALUE
test-lexer-one-token "blue bibs be big" LEX_STRING_VALUE
test-lexer-one-token blah LEX_IDENTIFIER
test-lexer-one-token __ LEX_IDENTIFIER
test-lexer-one-token undefined LEX_UNDEFINED_VALUE
test-lexer-one-token error LEX_ERROR_VALUE
test-lexer-one-token . LEX_SELECTION
test-lexer-one-token * LEX_MULTIPLY
test-lexer-one-token / LEX_DIVIDE
test-lexer-one-token % LEX_MODULUS
test-lexer-one-token + LEX_PLUS
test-lexer-one-token - LEX_MINUS
test-lexer-one-token & LEX_BITWISE_AND
test-lexer-one-token | LEX_BITWISE_OR
test-lexer-one-token ~ LEX_BITWISE_NOT
test-lexer-one-token ^ LEX_BITWISE_XOR
test-lexer-one-token << LEX_LEFT_SHIFT
test-lexer-one-token >> LEX_RIGHT_SHIFT
test-lexer-one-token >>> LEX_URIGHT_SHIFT
test-lexer-one-token && LEX_LOGICAL_AND
test-lexer-one-token || LEX_LOGICAL_OR
test-lexer-one-token ! LEX_LOGICAL_NOT
test-lexer-one-token < LEX_LESS_THAN
test-lexer-one-token <= LEX_LESS_OR_EQUAL
test-lexer-one-token > LEX_GREATER_THAN
test-lexer-one-token >= LEX_GREATER_OR_EQUAL
test-lexer-one-token == LEX_EQUAL
test-lexer-one-token != LEX_NOT_EQUAL
test-lexer-one-token is LEX_META_EQUAL
test-lexer-one-token isnt LEX_META_NOT_EQUAL
test-lexer-one-token = LEX_BOUND_TO
test-lexer-one-token ? LEX_QMARK
test-lexer-one-token : LEX_COLON
test-lexer-one-token ; LEX_SEMICOLON
test-lexer-one-token , LEX_COMMA
test-lexer-one-token [ LEX_OPEN_BOX
test-lexer-one-token ] LEX_CLOSE_BOX
test-lexer-one-token ( LEX_OPEN_PAREN
test-lexer-one-token ) LEX_CLOSE_PAREN
test-lexer-one-token { LEX_OPEN_BRACE
test-lexer-one-token } LEX_CLOSE_BRACE

test-lexer-one-token \ LEX_TOKEN_ERROR

######################################################################
#
# ClassAds
#
######################################################################
begin-classad Job-1
[
  Requirements = (other.Type == "Machine" && other.memory >= 4000);
  Type = "Job";
  Memoryused = 6000;
]
end-classad

begin-classad Machine-1
[
  Type = "machine";
  Requirements = (other.Type == "job" && other.memoryused < 8000);
  Memory = 5000;
]
end-classad

begin-classad Machine-2
[
  Type = "Machine";
  Requirements = other.mytype == "Job";
  Memory = 3000
]
end-classad

begin-classad Machine-3
[
  Type = "Machine";
  Requirements = other.mytype == "Job";
  Memory = 6000
]
end-classad

begin-classad Misc
[
  Type = "Misc";
  Self = [
           one = "foo";
		   two = "bar";
           rank = Other[StrCat(one, two)];
         ];
  Other = [
            one = 1;
            two = 2;
            foobar = 15
          ];
  Buddha = [
             which = Self.which;
           ];
  ClassAds = { [a = 1], [a = 2], [a = 3] };
  Set = ClassAds.a;
  SizeSet = size(Set);
  SizeZero = size({});
  SizeOne = size({1});
  SizeTwo = size({1, 2});
  Sum = sum(Set);
  Average = avg(Set);
  Min = min(Set);
  Max = max(Set);
  AllSmall = allcompare("<", Set, 100);
  AllBig   = allcompare(">", Set, 100); 
  AnyTwo   = anycompare("==", Set, 2);
  AllTwo   = allcompare("==", Set, 2);
  A = 1;
  B = true;
  C = !A;
  D = !B;
  R1 = regexp(".*\.cs\.uchicago\.edu",  "gargoyle.cs1uchicago.edu");
  R2 = regexp(".*\.cs\.wisc\.edu",     "beak.cs.wisc.edu");
  R3 = regexp(".*\.cs\.uchicago\.edu", "beak.cs.wisc.edu");
  R4 = regexp(".*\.cs\.wisc\.edu",     "gargoyle.cs.uchicago.edu");
  R5 = regexp(".*\.cs\.wisc\.edu|.*\.cs\.uchicago\.edu",     
              "gargoyle\.cs\.uchicago.edu");
  R6 = regexp(".*\.cs\.wisc\.edu|.*\.cs\.uchicago\.edu",     
              "beak.cs.wisc\.edu");

]
end-classad

begin-classad Motherboard
[
  have_match =    machine_enclosure.machine.Requirements 
              && job_enclosure.job.Requirements
              && storage_enclosure.storage.Requirements;

  machine_enclosure = 
  [ 
    job = job_enclosure.job;
	storage = storage_enclosure.storage;
    machine = [
                Type="Machine"; 
                RAM=6000;
                Requirements = (job.MemoryNeeded <= RAM);
              ];
  ];

  job_enclosure = 
  [
    machine = machine_enclosure.machine;
	storage = storage_enclosure.storage;
    job = [
            Type="Job";
            MemoryNeeded = 6000;
            DiskSpaceNeeded = 8000;
            Requirements = (machine.RAM >= MemoryNeeded
                         && storage.FreeDiskSpace > DiskSpaceNeeded)
          ];
  ];

  storage_enclosure = 
  [
    job = job_enclosure.job;
    machine = machine_enclosure.machine;
    storage = [
         Type = "Storage";
         FreeDiskSpace = 10000;
         Requirements = job.DiskSpaceNeeded < FreeDiskSpace;
         ];

  ];
]
end-classad

evaluate Motherboard job_enclosure.job.Requirements
evaluate Motherboard machine_enclosure.job.Requirements
evaluate Motherboard storage_enclosure.storage.Requirements
evaluate Motherboard have_match

######################################################################
#
# Basic Evaluation Tests
#
######################################################################
evaluate Job-1 TestTernary
evaluate Misc Self.rank
evaluate Machine-1 memory
evaluate Misc Set
evaluate Misc Sum
evaluate Misc Average
evaluate Misc Min
evaluate Misc Max
evaluate Misc AllSmall
evaluate Misc AllBig
evaluate Misc AnyTwo
evaluate Misc AllTwo
evaluate Misc ClassAds.b
evaluate Misc ClassAds.c
evaluate Misc All_Undefined
evaluate Misc Any_Undefined
evaluate Misc A
evaluate Misc B
evaluate Misc C
evaluate Misc D
evaluate Misc SizeSet;
evaluate Misc SizeZero;
evaluate Misc SizeOne;
evaluate Misc SizeTwo;
evaluate Misc R1;
evaluate Misc R2;
evaluate Misc R3;
evaluate Misc R4;
evaluate Misc R5;
evaluate Misc R6;

######################################################################
#
# Matching tests
#
######################################################################
test-match symmetricMatch Job-1 Machine-1 ExpectMatch
test-match leftMatchesRight Job-1 Machine-1 ExpectMatch
test-match rightMatchesLeft Job-1 Machine-1 ExpectMatch
test-match symmetricMatch Job-1 Machine-2 ExpectDontMatch

######################################################################
#
# Collections
#
######################################################################
#make-collection Machines machines-log
make-collection Machines
add-to-collection Machines Machine-1
add-to-collection Machines Machine-2
add-to-collection Machines Machine-3

create-subview Machines root Machine-View (other.Memory >= 4000)
check-in-view Machines Machine-View Machine-1 ExpectIn
check-in-view Machines Machine-View Machine-2 ExpectNotIn
check-in-view Machines Machine-View Machine-3 ExpectIn

create-subview Machines Machine-View BigMachine-View (other.Memory > 5000)
check-in-view Machines BigMachine-View Machine-1 ExpectNotIn
check-in-view Machines BigMachine-View Machine-2 ExpectNotIn
check-in-view Machines BigMachine-View Machine-3 ExpectIn

#truncate-log Machines

begin-classad Group-1
[
  Type = "Group";
  Users = {"Alain", "Peter"};
]
end-classad

begin-classad Group-2
[
  Type = "Group";
  Users = {"Annalisa", "David"};
]
end-classad

#make-collection Groups groups-log
make-collection Groups groups-log
add-to-collection Groups Group-1
add-to-collection Groups Group-2

begin-classad List-Eval
[ a = { x }; x = 1 ]
end-classad

evaluate Misc SizeOne;
evaluate Misc SizeTwo;
evaluate List-Eval a[0]

begin-classad Lexer-Fault
[ a=!b; b=true; ]
end-classad
evaluate Lexer-Fault b
evaluate Lexer-Fault a

begin-classad Octal
[ a = "\101\044\44\1"; /* Should be A(( */ ]
end-classad
evaluate Octal a

begin-classad Floats
[a = 0.7 * 4.5; ]
end-classad

begin-classad Quoted-Names
[
  'a' = 4;
  'b.##$%' = 5;
]
end-classad

begin-classad Times
[
  Abs1 = absTime("2003-09-03T");
  Rel1 = relTime("2+25:14:16.123");
]
end-classad

begin-classad Numbers
[
  X = 4.3;
  Y = real("4.3");
  Not = real("NaN");
  Infinite = real("INF");
  Negative_Infinite = real("-INF");
]
end-classad

print-classad Floats
print-classad Quoted-Names
print-classad Times
print-classad Numbers
print-classad-xml Numbers

begin-classad Loop
[
  attr = a//b
]
end-classad 

#begin-classad Crash
#[
#  attr = a<b>
#]
#end-classad 

begin-classad policy
[
  type = 'machine';
  access_times = 
    [
        globus = [start = 1900; end = 2100;];
        condor = [start = 100; end = 500;];
    ]
]
end-classad

evaluate policy access_times
evaluate policy access_times["globus"]
evaluate policy access_times["globus"].start

