/* Test for sizeinbase function.

Copyright 2014 Free Software Foundation, Inc.

This file is part of the GNU MP Library test suite.

The GNU MP Library test suite is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 3 of the License,
or (at your option) any later version.

The GNU MP Library test suite is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Public License for more details.

You should have received a copy of the GNU General Public License along with
the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */


#include <stdlib.h>
#include <stdio.h>

#include "gmp-impl.h"
#include "tests.h"

/* Exponents up to 2^SIZE_LOG */
#ifndef SIZE_LOG
#define SIZE_LOG 13
#endif

#ifndef COUNT
#define COUNT 30
#endif

#define MAX_N (1<<SIZE_LOG)

int
main (int argc, char **argv)
{
  mp_limb_t a;
  mp_ptr pp, scratch;
  mp_limb_t max_b;
  int count = COUNT;
  int test;
  gmp_randstate_ptr rands;
  TMP_DECL;

  TESTS_REPS (count, argv, argc);

  tests_start ();
  TMP_MARK;
  rands = RANDS;

  pp = TMP_ALLOC_LIMBS (MAX_N);
  scratch = TMP_ALLOC_LIMBS (MAX_N);
  max_b = numberof (mp_bases);

  ASSERT_ALWAYS (max_b > 62);
  ASSERT_ALWAYS (max_b < GMP_NUMB_MAX);

  for (a = 2; a < max_b; ++a)
    for (test = 0; test < count; ++test)
      {
	mp_size_t pn;
	mp_limb_t exp;
	mp_bitcnt_t res;

	exp = gmp_urandomm_ui (rands, MAX_N);

	pn = mpn_pow_1 (pp, &a, 1, exp, scratch);

	res = mpn_sizeinbase (pp, pn, a) - 1;

	if ((res < exp) || (res > exp + 1))
	  {
	    printf ("ERROR in test %d, base = %d, exp = %d, res = %d\n",
		    test, (int) a, (int) exp, (int) res);
	    abort();
	  }

	mpn_sub_1 (pp, pp, pn, CNST_LIMB(1));
	pn -= pp[pn-1] == 0;

	res = mpn_sizeinbase (pp, pn, a);

	if ((res < exp) || (res - 1 > exp))
	  {
	    printf ("ERROR in -1 test %d, base = %d, exp = %d, res = %d\n",
		    test, (int) a, (int) exp, (int) res);
	    abort();
	  }
      }

  TMP_FREE;
  tests_end ();
  return 0;
}
