Module:       collections-test-suite
Synopsis:     Test bit-vector-not function
Author:       Keith Dennison
Copyright:    Original Code is Copyright (c) 1995-2004 Functional Objects, Inc.
              All rights reserved.
License:      Functional Objects Library Public License Version 1.0
Dual-license: GNU Lesser General Public License
Warranty:     Distributed WITHOUT WARRANTY OF ANY KIND


define test bit-vector-not-empty-vector (description: "")
  let vector = make(<bit-vector>, size: 0);

  let (result, result-pad) = bit-vector-not(vector, pad: 0);
  check-equal("Empty vector with pad 0: size(bit-vector-not(vector)) is 0",
    size(result), 0);
  check-equal("Empty vector with pad 0, bit-vector-not(vector) pad is 1",
    result-pad, 1);

  let (result, result-pad) = bit-vector-not(vector, pad: 1);
  check-equal("Empty vector with pad 1, size(bit-vector-not(vector) is 0",
    size(result), 0);
  check-equal("Empty vector with pad 1, bit-vector-not(vector) pad is 0",
    result-pad, 0);
end test;


define test bit-vector-not!-empty-vector (description: "")
  let vector = make(<bit-vector>, size: 0);

  let (result, result-pad) = bit-vector-not!(vector, pad: 0);
  check-equal("Empty vector with pad 0: bit-vector-not!(vector) == vector",
    result, vector);
  check-equal("Empty vector with pad 0: size(bit-vector-not!(vector)) = 0",
    size(result), 0);
  check-equal("Empty vector with pad 0: bit-vector-not!(vector), pad is 1",
    result-pad, 1);

  let (result, result-pad) = bit-vector-not!(vector, pad: 1);
  check-equal("Empty vector with pad 1: bit-vector-not!(vector) == vector",
    result, vector);
  check-equal("Empty vector with pad 1: size(bit-vector-not!(vector)) = 0",
    size(result), 0);
  check-equal("Empty vector with pad 1: bit-vector-not!(vector) pad is 0",
    result-pad, 0);
end test;


define test bit-vector-not-tiny-vector (description: "")
  let vector1 :: <bit-vector> = make(<bit-vector>, size: $tiny-size);
  let vector2 :: <bit-vector> = make(<bit-vector>, size: $tiny-size, fill: 1);
  let vector3 :: <bit-vector> = make(<bit-vector>, size: $tiny-size);

  let vector3-elements = list(0, 2, 3, 7, 8, 10, 12);
  let not-vector3-elements = list(1, 4, 5, 6, 9, 11, 13);
  do(method(bit) vector3[bit] := 1 end, vector3-elements);

  // bit-vector-not of an all-zero vector
  //
  let (result, result-pad) = bit-vector-not(vector1);
  bit-vector-checks(result, result-pad,
    "bit-vector-not of an all-zero vector with default pad",
    $tiny-size, #"all-ones", 1);

  let (result, result-pad) = bit-vector-not(vector1, pad: 1);
  bit-vector-checks(result, result-pad,
    "bit-vector-not of an all-zero vector with pad = 1",
    $tiny-size, #"all-ones", 0);

  // bit-vector-not of an all-one vector
  //
  let (result, result-pad) = bit-vector-not(vector2, pad: 0);
  bit-vector-checks(result, result-pad,
    "bit-vector-not of an all-one vector with pad = 0",
    $tiny-size, #"all-zeros", 1);

  let (result, result-pad) = bit-vector-not(vector2, pad: 1);
  bit-vector-checks(result, result-pad,
    "bit-vector-not of an all-one vector with pad = 1",
    $tiny-size, #"all-zeros", 0);

  // bit-vector-not of a vector
  //
  let (result, result-pad) = bit-vector-not(vector3);
  bit-vector-checks(result, result-pad,
    "bit-vector-not of a vector with default pad",
    $tiny-size, not-vector3-elements, 1);

  let (result, result-pad) = bit-vector-not(vector3, pad: 1);
  bit-vector-checks(result, result-pad,
    "bit-vector-not of a vector with pad = 1",
    $tiny-size, not-vector3-elements, 0);
end test;


define test bit-vector-not!-tiny-vector (description: "")
  let vector1 :: <bit-vector> = make(<bit-vector>, size: $tiny-size);
  let vector2 :: <bit-vector> = make(<bit-vector>, size: $tiny-size);
  let vector3 :: <bit-vector> = make(<bit-vector>, size: $tiny-size);

  let vector3-elements = list(1, 4, 5, 6, 9, 11, 13);
  let not-vector3-elements = list(0, 2, 3, 7, 8, 10, 12);
  do(method(bit) vector3[bit] := 1 end, vector3-elements);

  // bit-vector-not! of an all-zero vector
  //
  let (result, result-pad) = bit-vector-not!(vector1);
  check-equal("With default pad, bit-vector-not!(vector1) == vector1",
    result, vector1);
  bit-vector-checks(result, result-pad,
    "bit-vector-not! of an all-zero vector with default pad",
    $tiny-size, #"all-ones", 1);

  let (result, result-pad) = bit-vector-not!(vector2, pad: 1);
  check-equal("With pad = 1, bit-vector-not!(vector2) == vector2",
    result, vector2);
  bit-vector-checks(result, result-pad,
    "bit-vector-not! of an all-zero vector with pad = 1",
    $tiny-size, #"all-ones", 0);

  // bit-vector-not of an all-one vector
  //
  let (result, result-pad) = bit-vector-not!(vector1, pad: 0);
  check-equal("With pad = 0, bit-vector-not!(vector1) == vector1",
    result, vector1);
  bit-vector-checks(result, result-pad,
    "bit-vector-not! of an all-one vector with pad = 0",
    $small-size, #"all-zeros", 1);

  let (result, result-pad) = bit-vector-not!(vector2, pad: 1);
  check-equal("With pad = 1, bit-vector-not!(vector2) == vector2",
    result, vector2);
  bit-vector-checks(result, result-pad,
    "bit-vector-not! of an all-one vector with pad = 1",
    $tiny-size, #"all-zeros", 0);

  // bit-vector-not of a vector
  //
  let (result, result-pad) = bit-vector-not!(vector3);
  check-equal("With default pad, bit-vector-not!(vector3) == vector3",
    result, vector3);
  bit-vector-checks(result, result-pad,
    "bit-vector-not! of a vector with default pad",
    $tiny-size, not-vector3-elements, 1);

  let (result, result-pad) = bit-vector-not!(vector3, pad: 1);
  check-equal("With pad = 1, bit-vector-not!(vector3) == vector3",
    result, vector3);
  bit-vector-checks(result, result-pad,
    "bit-vector-not! of a vector with pad = 1",
    $tiny-size, vector3-elements, 0);
end test;


define test bit-vector-not-huge-vector ()
end test;

define test bit-vector-not!-huge-vector ()
end test;

define test bit-vector-not-multiple-word-sized-vector ()
end test;

define test bit-vector-not!-multiple-word-sized-vector ()
end test;


define suite bit-vector-not-suite ()
  test bit-vector-not-empty-vector;
  test bit-vector-not!-empty-vector;
  test bit-vector-not-tiny-vector;
  test bit-vector-not!-tiny-vector;
  test bit-vector-not-huge-vector;
  test bit-vector-not!-huge-vector;
  test bit-vector-not-multiple-word-sized-vector;
  test bit-vector-not!-multiple-word-sized-vector;
end suite;