#!/usr/bin/env ruby
# Ruby/GSL implementation of GSL "combination/test.c"
require("gsl")
require("./gsl_test.rb")
include GSL::Test

c63 = GSL::Matrix.alloc([0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 5], 
                 [0, 2, 3], [0, 2, 4], [0, 2, 5], 
                 [0, 3, 4], [0, 3, 5],
                 [0, 4, 5], 
                 [1, 2, 3], [1, 2, 4], [1, 2, 5],
                 [1, 3, 4], [1, 3, 5],
                 [1, 4, 5],
                 [2, 3, 4], [2, 3, 5], [2, 4, 5],
                 [3, 4, 5])

GSL::IEEE.env_setup()

status = false
c = GSL::Combination.alloc(6, 3)
c.init_first

i = 0
begin
  if i >= 20
    status = true
    break
  end
  for j in 0...3
    status |= (c.data[j] != c63[i,j])
  end

  s1 = c.valid?
  desc = sprintf("GSL::Combination#valid\(%u\)", i)
  GSL::Test.test(s1, desc)
  i += 1
end while c.next == GSL::SUCCESS

GSL::Test.test(status, "GSL::Combination#next, 6 choose 3 combination, 20 steps")

c.next
c.next
c.next

for j in 0...3 
  status |= (c.data[j] != c63[19,j])
end
GSL::Test.test(status, "GSL::Combination#next on the last combination")

s1 = c.valid?
GSL::Test.test(s1, "GSL::Combination#valid on the last combination")

d = GSL::Combination.alloc(6, 3)
GSL::Combination.memcpy(d, c)

status = false
for j in 0...3 
  status |= (d.data[j] != c.data[j])
end
GSL::Test.test(status, "GSL::Combination.memcpy, 6 choose 3 combination")

c.init_last
i = 20
begin
  if i == 0
    status = true
    break;
  end
  i -= 1
  for j in 0...3
    status |= (c.data[j] != c63[i,j])
  end
  s1 = c.valid?
  desc = sprintf("GSL::Combination#valid\(%u\)", i)
  GSL::Test.test(s1, desc)
end while c.prev == GSL::SUCCESS

GSL::Test.test(status, "GSL::Combination#prev, 6 choose 3 combination, 20 steps")

c.prev
c.prev
c.prev

for j in 0...3
  status |= (c.data[j] != c63[0,j])
end
GSL::Test.test(status, "GSL::Combination#prev on the first combination")

s1 = c.valid?
GSL::Test.test(s1, "GSL::Combination#valid on the first combination")
d = GSL::Combination.alloc(6, 3)
GSL::Combination.memcpy(d, c)

status = false
for j in 0...3 
  status |= (d.data[j] != c.data[j])
end
GSL::Test.test(status, "GSL::Combination.memcpy, 6 choose 3 combination")

c = GSL::Combination.calloc(7, 0)
status |= (c.next != GSL::FAILURE)
status |= (c.next != GSL::FAILURE)
status |= (c.prev != GSL::FAILURE)
status |= (c.prev != GSL::FAILURE)
GSL::Test.test(status, "GSL::Combination 7 choose 0")

c = GSL::Combination.calloc(7, 7)
for j in 0...7
  status |= (c.get(j) != j)
end
status |= (c.next != GSL::FAILURE)
for j in 0...7
  status |= (c.get(j) != j)
end
status |= (c.next != GSL::FAILURE)
for j in 0...7
  status |= (c.get(j) != j)
end
status |= (c.next != GSL::FAILURE)
for j in 0...7
  status |= (c.get(j) != j)
end
GSL::Test.test(status, "GSL::Combination 7 choose 7")