$Gestinanna::POF::NumTests::API = 18 + 2 + 5*6;
$Gestinanna::POF::NumTests::SECURE_API = 14;
$Gestinanna::POF::NumTests::SECURE_RO_API = 8;

sub run_api_tests {
    my($factory, $object_id, $field) = @_;

    my $e; # for $@;

    ## 1

    eval {
        $object = $factory -> new(test => (object_id => $object_id));
    };

    $e = $@; diag($e) if $e;
    ok($object && !$e, "Creating a new object");



    ## 2

    my $is_live;
    eval {
        $is_live = $object -> is_live;
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Called is_live");

    ## 3

    is($is_live, 0, "Object is not live");


    ## 4

    eval {
        $object -> $field('other');
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Setting a value");


    ## 5

    my $this;
    eval {
        $this = $object -> $field;
    };

    $e = $@; diag($e) if $e;
    is($this, 'other');


    ## 6

    eval {
        $object -> save;
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Saving object");


    ## 7

    eval {
        $is_live = $object -> is_live;
    };

    $e = $@; diag($e) if $e;
    is($is_live, 1, "Object is live");


    ## 8

    eval {
        $object -> $field('another');
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Updating a value");

    ## 9

    eval {
        $this = $object -> $field;
    };

    $e = $@; diag($e) if $e;
    is($this, 'another');


    ## 10

    eval {
        $object -> save;
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Saving object");


    ## 11

    eval {
        $is_live = $object -> is_live;
    };

    $e = $@; diag($e) if $e;
    is($is_live, 1, "Object is live");



    ## 12

    undef $object;

    eval {
        $object = $factory -> new(test => (object_id => $object_id));
    };

    $e = $@; diag($e) if $e;
    ok($object && !$e, "Loading an old object");


    ## 13

    eval {
        $is_live = $object -> is_live;
    };

    $e = $@; diag($e) if $e;
    is($is_live, 1, "Object is live");


    ## 14
    
    eval {
        $this = $object -> $field;
    };
    
    $e = $@; diag($e) if $e;
    is($this, 'another');



    ## 15

    eval {
        $object -> delete;
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Deleting object");

    ## 16

    eval {
        $is_live = $object -> is_live;
    };
  
    $e = $@; diag($e) if $e;
    is($is_live, 0, "Object is not live");


    ## 17

    undef $object;
 
    eval {
        $object = $factory -> new(test => (object_id => $object_id));
    };
    
    $e = $@; diag($e) if $e;
    ok($object && !$e, "Loading deleted object");

    
    ## 18

    eval {
        $is_live = $object -> is_live;
    };

    $e = $@; diag($e) if $e;
    is($is_live, 0, "Object is not live");

    ## now to load a series of objects and then do some simple searching
    my @foos = qw(foo bar bing bar bat bot fot fite lite latte little spittle foo bot);

    eval {
        for my $i (0..$#foos) {
            $object = $factory -> new(test => (object_id => $i+1));
            $object -> $field($foos[$i]);
            $object -> save;
        }
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Created a bunch of objects");

    my $cursor;
    my $id;
    my @list;

    my @searches = (
        [ {
              where => [ $field, qw(= foo) ],
          },
          [ qw(1 13) ],
        ],
        [
          {
              where => [ OR => (
                             [ $field, qw~= foo~ ],
                             [ $field, qw~= bar~ ],
                         )
                       ],
          },
          [ qw(1 2 4 13) ],
        ],
        [
          {
             where => [ AND => (
                             [ NOT => $field, qw!= foo! ],
                             [ NOT => $field, qw!= bar! ],
                        )
                      ],
          },
          [ qw(3 5 6 7 8 9 10 11 12 14) ],
       ],
       [
          {
             where => [ NOT => OR => (
                             [ $field, qw!= foo! ],
                             [ $field, qw!= bar! ],
                        )
                      ],
          },
          [ qw(3 5 6 7 8 9 10 11 12 14) ],
       ],
#    );
#
#=pod
       [
          {
             where => [ NOT => OR => (
                             [ $field, qw!= foo! ],
                             [ $field, qw!= bar! ],
                        )
                      ],
             limit => 5,
          },
          [ qw(3 5 6 7 8) ],
       ],
       [
          {
             where => [ NOT => OR => (
                             [ $field, qw!= foo! ],
                             [ $field, qw!= bar! ],
                        )
                      ],
             limit => [ 5, 3 ],
          },
          [ qw(6 7 8 9 10) ],
       ],
    );
#=cut

    # 5x@searches tests (was 4 + @{$search->[1]} per search)
    foreach my $search (@searches) {
        $cursor = undef;
        eval {
            $cursor = $factory -> find(test => (%{$search->[0]}))
        };

        $e = $@; diag($e) if $e;
        ok(!$e, "Did a search");

        ok(defined($cursor), "Returned a cursor");

        @list = ( );
        eval {
            while($id = $cursor -> next_id) {
                push @list, $id;
            }
        };

        $e = $@; diag($e) if $e;
        ok(!$e, "Fetch object ids");

        is(scalar(@list), scalar(@{$search->[1]}), "Right number of objects");
        is_deeply(\@list, $search -> [1], "Right list of objects");
    }

    eval {
        for my $i (0..$#foos) {
            $object = $factory -> new(test => (object_id => $i+1));
            $object -> delete;
        }
    };

    $e = $@;  diag($e) if $e;
    ok(!$e, "Removed the bunch of objects");

}

sub run_secure_api_tests {
    my($factory, $object_id, $field) = @_;

    my $e; # for $@;
    my $object;

    ## 1

    eval {   
        $object = $factory -> new(test => (object_id => $object_id));
    };
      
    $e = $@; diag($e) if $e;
    ok($object && !$e, "Creating a new object");

    ## 2-3 (temp?)
    ok($object -> isa('Gestinanna::POF::Secure'));
    ok($object -> isa('Gestinanna::POF::Base'));

    ok($object -> isa('Gestinanna::POF::Secure'));
    ok($object -> isa('Gestinanna::POF::Base'));

    ## 2 - 5

    $main::has_actor =
    $main::has_access_attribute =
    $main::has_access_access = undef;

    eval {
        $object -> $field('other');
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Setting a value");


    ok($main::has_actor, "Has actor on set");
    ok($main::has_access_attribute, "Has an attribute on set");
    is($main::has_access_access && $main::has_access_access->[0], 'write', "Requesting write access");

    ## 6 - 9

    $main::has_actor =
    $main::has_access_attribute =
    $main::has_access_access = undef;

    my $this;  
    eval {
        $this = $object -> $field;
    };
      
    $e = $@; diag($e) if $e;
    is($this, 'other');

    ok($main::has_actor, "Has actor on get");
    ok($main::has_access_attribute, "Has an attribute on get");
    is($main::has_access_access && $main::has_access_access->[0], 'read', "Requesting read access");

    ## 10

    eval {
        $object -> delete;
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Object deleted");

}

sub run_secure_ro_api_tests {
    my($factory, $object_id, $field) = @_;

    my $e; # for $@;
    my $object;

    ## 1

    eval {   
        $object = $factory -> new(ro_test => (object_id => $object_id));
    };
      
    $e = $@; diag($e) if $e;
    ok($object && !$e, "Creating a new object");

    ## 2-3 (temp?)
    ok($object -> isa('Gestinanna::POF::Secure'));
    ok($object -> isa('Gestinanna::POF::Base'));

    ok($object -> isa('Gestinanna::POF::Secure'));
    ok($object -> isa('Gestinanna::POF::Base'));

    ## 2 - 5

    eval {
        $object -> $field('other');
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Setting a value");


    ## 6 - 9

    my $this;  
    eval {
        $this = $object -> $field;
    };
      
    $e = $@; diag($e) if $e;
    is($this, undef);

    ## 10

    eval {
        $object -> delete;
    };

    $e = $@; diag($e) if $e;
    ok(!$e, "Object deleted");

}

1;
