() = evalfile ("inc.sl");

testing_feature ("NaN and Inf");

if (isnan (0)) failed ("isnan(0)");
if (isnan (0.0)) failed ("isnan(0.0)");
if (isinf (0)) failed ("isinf(0)");
if (isinf (0.0)) failed ("isinf(0.0)");

if (0 == isnan (_NaN)) failed ("isnan (_NaN)");
if (0 == isnan (-_NaN)) failed ("isnan (-_NaN)");
if (isinf (_NaN)) failed ("isinf(_NaN)");
if (isinf (-_NaN)) failed ("isinf(-_NaN)");

if (isnan (_Inf)) failed ("isnan (_Inf)");
if (isnan (-_Inf)) failed ("isnan (-_Inf)");
if (0 == isinf (_Inf)) failed ("isinf(_Inf)");
if (0 == isinf (-_Inf)) failed ("isinf(-_Inf)");

private define test_sscanf (ret, str, format, x, y)
{
   variable x1, y1, ret1;

   ret1 = sscanf (str, format, &x1, &y1);
   if (ret1 != ret)
     failed ("sscanf (str=%s using format=%s failed: returned %d",
	     str, format, ret1);
   if (ret > 0)
     {
	if (isnan (x))
	  {
	     ifnot (isnan(x1))
	       failed ("sscanf (str=%s using format=%s arg1 failure: got %S",
		       str, format, x1);
	  }
	else if (isinf (x))
	  {
	     if ((isnan(x1))
		 || (x1 != x))
	       failed ("sscanf (str=%s using format=%s arg1 failure: got %S",
		       str, format, x1);
	  }
     }
   if (ret > 1)
     {
	if (isnan (y))
	  {
	     ifnot (isnan(y1))
	       failed ("sscanf (str=%s using format=%s arg2 failure: got %S",
		       str, format, y1);
	  }
	else if (isinf (y))
	  {
	     if ((isnan(y1))
		 || (y1 != y))
	       failed ("sscanf (str=%s using format=%s arg2 failure: got %S",
		       str, format, y1);
	  }
     }
}

test_sscanf (1, "Nany", "%lf", _NaN, NULL);
test_sscanf (2, "NanInf", "%lf%lf", _NaN, _Inf);
test_sscanf (2, "Nan -Inf", "%lf %lf", _NaN, -_Inf);
test_sscanf (2, "Nan(xxx) -Inf", "%lf %lf", _NaN, -_Inf);
test_sscanf (2, "Nan() -Inf", "%lf %lf", _NaN, -_Inf);
test_sscanf (1, "Nan( -Inf", "%lf %lf", _NaN, -_Inf);
test_sscanf (2, "-Nan() -Inf", "%lf %lf", _NaN, -_Inf);

print ("Ok\n");

exit (0);

