/* version.c --- Version handling self tests.
 * Copyright (C) 2019-2025 Free Software Foundation, Inc.
 *
 * This file is part of LIBTASN1.
 *
 * This program 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.
 *
 * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#include <config.h>

#include <stdio.h>		/* printf */
#include <stdlib.h>		/* EXIT_SUCCESS */
#include <string.h>		/* strcmp */

/* Get ASN1 prototypes. */
#include <libtasn1.h>

int
main (int argc, char *argv[])
{
  int exit_code = EXIT_SUCCESS;
  char out[100];
  int j;
  unsigned gvn = ASN1_VERSION_NUMBER;
  unsigned gvmmp = (ASN1_VERSION_MAJOR << 16)
    + (ASN1_VERSION_MINOR << 8) + ASN1_VERSION_PATCH;

  printf ("ASN1_VERSION: %s\n", ASN1_VERSION);
  printf ("ASN1_VERSION_MAJOR: %d\n", ASN1_VERSION_MAJOR);
  printf ("ASN1_VERSION_MINOR: %d\n", ASN1_VERSION_MINOR);
  printf ("ASN1_VERSION_PATCH: %d\n", ASN1_VERSION_PATCH);
  printf ("ASN1_VERSION_NUMBER: %x\n", gvn);
  printf ("(ASN1_VERSION_MAJOR << 16) + (ASN1_VERSION_MINOR << 8)"
	  " + ASN1_VERSION_PATCH: %x\n", gvmmp);

  j = snprintf (out, sizeof (out) - 1, "%d.%d.%d", ASN1_VERSION_MAJOR,
		ASN1_VERSION_MINOR, ASN1_VERSION_PATCH);
  if (j < 0)
    {
      printf ("snprintf failure: %d", j);
      exit_code = EXIT_FAILURE;
      out[0] = '\0';
    }

  if (out[0])
    printf ("ASN1_VERSION_MAJOR.ASN1_VERSION_MINOR.ASN1_VERSION_PATCH: %s\n",
	    out);

  printf ("asn1_check_version (NULL): %s\n", asn1_check_version (NULL));

  if (!asn1_check_version (ASN1_VERSION))
    {
      printf ("FAIL: asn1_check_version (ASN1_VERSION)\n");
      exit_code = EXIT_FAILURE;
    }

  if (!asn1_check_version ("4.17.0"))
    {
      printf ("asn1_check_version(4.17.0) failure\n");
      exit_code = EXIT_FAILURE;
    }

  if (!asn1_check_version ("4.17"))
    {
      printf ("asn1_check_version(4.17) failure\n");
      exit_code = EXIT_FAILURE;
    }

  if (strcmp (ASN1_VERSION, asn1_check_version (NULL)) != 0)
    {
      printf ("FAIL: strcmp (ASN1_VERSION, asn1_check_version (NULL))\n");
      exit_code = EXIT_FAILURE;
    }

  if (ASN1_VERSION_NUMBER != gvn)
    {
      printf ("FAIL: ASN1_VERSION_NUMBER != gvn\n");
      exit_code = EXIT_FAILURE;
    }

  if (out[0])
    {
      if (!asn1_check_version (out))
	{
	  printf ("FAIL: asn1_check_version(%s)\n", out);
	  exit_code = EXIT_FAILURE;
	}

      /* ASN1_VERSION may look like "1.0.4.10-b872" but the derived string
         should be "1.0.4" anyway.  */
      if (strncmp (ASN1_VERSION, out, strlen (out)) != 0)
	{
	  printf ("FAIL: strncmp (ASN1_VERSION, %s, strlen (%s))\n", out,
		  out);
	  exit_code = EXIT_FAILURE;
	}
    }

  if (asn1_check_version ("4711.42.23"))
    {
      printf ("FAIL: asn1_check_version(4711.42.23)\n");
      exit_code = EXIT_FAILURE;
    }

  if (asn1_check_version ("UNKNOWN"))
    {
      printf ("FAIL: asn1_check_version (UNKNOWN)\n");
      exit_code = EXIT_FAILURE;
    }

  return exit_code;
}
