#!/usr/bin/perl -w
#
#   @(#)$Id: t58typeinfoall.t,v 2003.2 2003/01/03 19:02:36 jleffler Exp $
#
#   Test type_info_all
#
#   Copyright 2002-03 IBM

use DBD::Informix::TestHarness;
use strict;

# NB: Cannot determine the number of tests a priori.

my $dbh = connect_to_test_database();
stmt_ok;

my $arr = $dbh->type_info_all;

stmt_fail("invalid return from type_info_all") unless defined $arr;
stmt_ok;

my @tia = @$arr;
my %map = %{$tia[0]};
shift @tia;     # Remove the mapping reference.

my %dbi_map =
	(
		TYPE_NAME          =>  0,
		DATA_TYPE          =>  1,
		COLUMN_SIZE        =>  2,
		LITERAL_PREFIX     =>  3,
		LITERAL_SUFFIX     =>  4,
		CREATE_PARAMS      =>  5,
		NULLABLE           =>  6,
		CASE_SENSITIVE     =>  7,
		SEARCHABLE         =>  8,
		UNSIGNED_ATTRIBUTE =>  9,
		FIXED_PREC_SCALE   => 10,
		AUTO_UNIQUE_VALUE  => 11,
		LOCAL_TYPE_NAME    => 12,
		MINIMUM_SCALE      => 13,
		MAXIMUM_SCALE      => 14,
		SQL_DATA_TYPE      => 15,
		SQL_DATETIME_SUB   => 16,
		NUM_PREC_RADIX     => 17,
		INTERVAL_PRECISION => 18,
	);

stmt_note "# map:\n";
my %inv;
foreach (sort keys %map)
{
	&stmt_note("# $_ => $map{$_}\n");
	(!defined $dbi_map{$_} || $map{$_} == $dbi_map{$_}) ? stmt_ok : stmt_nok("$map{$_} != $dbi_map{$_}");
	$inv{$map{$_}} = $_;
}
stmt_note "# inv:\n";
my ($min, $max) = (9999999999, -1);
foreach (sort { $a <=> $b } keys %inv)
{
	stmt_note "# $_ => $inv{$_}\n";
	$min = $_ if $_ < $min;
	$max = $_ if $_ > $max;
}
($min == 0) ? stmt_ok : stmt_nok("Minimum index not zero in map ($min)");
($max > 13) ? stmt_ok : stmt_nok("Maximum index not big enough in map ($max)");

stmt_note "# type info:\n";
for (my $i = 0; $i <= $#tia; $i++)
{
	my @info = @{$tia[$i]};
	my $pad = "$i => ";
	my $str = "";
	for (my $j = 0; $j <= $#info; $j++)
	{
		my $val = $info[$j];
		if (!defined $val)
		{
			$val = "undef"
		}
		elsif ($val !~ m/^[-+]?\d+$/)
		{
			$val =~ s/"/\\"/g;
			$val = qq{"$val"};
		}
		$str .= "$pad$val";
		$pad = ", ";
	}
	stmt_note "# $str\n";
}

$dbh->disconnect or stmt_fail;

my $n = &stmt_counter();
print "1..$n\n";

all_ok;
