Identtest


Identtest


Identtest ("IDENTity TEST") is a self-consistency utility.

When run, it will recursively examine the current directory and all its subdirectories, looking for .rex and .cls files, and it will run the elident test and the trident test against each of these files, stopping when all files are processed, or When a file doesn't pass some test, whichever happens first.

Options allow to include .testGroup files in the search, to activate support for Executor, and to selectively deactivate searching for .rex or .cls files, or to choose only one of the identity tests instead of both.

Usage

[rexx] identtest [OPTIONS] ["start"]

Options

--help, -? Display this help
--executor, -xtr Support Executor syntax
-it, --itrace Print internal traceback on error
--testgroup, -tg Analyze .testgroup files
--noelements, -ne Don't run the elident test
--notree, -nt Don't run the trident test
--norexx, --norex, -nr   Don't analyze .rex files
--nocls, -nc Don't analyze .cls files

If you specify "start", the myname tests are started; otherwise, this help is displayed.

Examples

Perform a self-test of the Rexx Parser files

First cd to the root directory of the Parser, and then simply run

[rexx] identtest

Perform a self-test of Executor features

First cd to the root of the Executor files, and then run

[rexx] identtest -xtr

Perform a self-test of the oorexx test/trunk files

First cd to the ooRexx test/trunk directory, and then run

[rexx] identtest -tg

Program source

#!/usr/bin/env rexx
/******************************************************************************/
/*                                                                            */
/* identtest.rex - Test Rexx programs in a file tree                          */
/* =================================================                          */
/*                                                                            */
/* This program is part of the Rexx Parser package                            */
/* [See https://rexx.epbcn.com/rexx-parser/]                                  */
/*                                                                            */
/* Copyright (c) 2024-2026 Josep Maria Blasco <josep.maria.blasco@epbcn.com>  */
/*                                                                            */
/* License: Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0)  */
/*                                                                            */
/* Version history:                                                           */
/*                                                                            */
/* Date     Version Details                                                   */
/* -------- ------- --------------------------------------------------------- */
/* 20251211    0.3a First public release                                      */
/* 20251215    0.4a Add toggles for Executor support, .TestGroup files        */
/*                  Change name to identtest (thanks, JLF!)                   */
/* 20251221         Add --itrace option, improve error messages               */
/* 20251226         Send error messages to .error, not .output                */
/* 20251227         Use .SysCArgs when available                              */
/* 20260102         Standardize help options to -h and --help                 */
/*                                                                            */
/******************************************************************************/

  -- identtest
  --
  -- Usage: cd to a directory run it.
  --
  -- By default, the script will recursively examine the whole directory
  -- tree and run the elident and trident tests against all .rex and .cls
  -- files. The script will stop when all files have been processed, or when
  -- an error is encountered.
  --
  -- Run "indentest --help" to show a list of the available options.
  --
  -- See also the list of exceptions below
  --


  package =  .context~package

  myName  =   package~name
  Parse Caseless Value FileSpec( "Name", myName ) With myName".rex"
  myHelp  = ChangeStr(                                         -
   "myName",                                                   -
   "https://rexx.epbcn.com/rexx-parser/doc/utilities/myName/", -
    myName)
  Parse Source . how .
  If how == "COMMAND", .SysCArgs \== .Nil
    Then args = .SysCArgs
    Else args = ArgArray(Arg(1))

  elements           = 1
  tree               = 1
  itrace             = 0
  executor           = 0
  SysFileTreeOptions = "FSO"

  If args~items == 0 Then Signal Help

ProcessOptions:
  Loop While args~items > 0

    option = args[1]
    args~delete(1)

    If Lower(option) == "start", args~items == 0 Then Leave

    Select Case Lower(option)
      When "--help",               "-h" Then Signal Help
      When "--itrace",            "-it" Then itrace = 1
      When "--executor",         "-xtr" Then executor  = 1
      When "--noelements",        "-ne" Then elements  = 0
      When "--notree",            "-nt" Then tree      = 0
      Otherwise Call Error "Invalid option '"option"'."
    End

  End

  If Executor Then option = "-xtr"
  Else             option = ""

  cd = Directory()~changeStr("\","/")

  extensions = "cls rex testgroup jrexx oodTestGroup rxj rxo testUnit rxu"

  exception. = 0

  -- Exceptions for .rex
  ----------------------

  -- The following exceptions are tailored to the Executor tree.

  -- expression=
  exceptions = "executor-demo-array.rex executor-demo-extensions.rex"            -
    "executor-demo-text-compatibility-auto-conv.rex"                             -
    "executor-demo-text-compatibility.rex executor-demo-text-internal_checks.rex"-
    "executor-demo-text-unicode.rex executor-demo-text.rex"                      -
    "ooRexxShell-demo-interpreters.rex ooRexxShell-demo-queries.rex"             -
    "diary_examples.rex include_concatenation_infos.rex"                         -
    "include_concatenation_infos.rex include_conversion.rex"                     -
    "include_conversion_infos.rex"

  -- Real error
  exceptions ||= " classic_rexx.rex ooRexxTry.rex"

  -- malformed expression

  exceptions ||= " include_conversion_to_unicode.rex include_conversion_to_unicode16.rex include_conversion_to_unicode32.rex" -
    "include_conversion_to_unicode8.rex include_conversion_to_utf16be.rex include_conversion_to_utf16le.rex"                 -
    "include_conversion_to_utf32be.rex include_conversion_to_utf32le.rex include_conversion_to_utf8.rex"                     -
    "include_conversion_to_wtf16be.rex include_conversion_to_wtf16le.rex include_conversion_to_wtf8.rex"                     -
    "main_concatenation.rex main_conversion.rex"

  -- test/trunk (SVN)
  exceptions ||=  " tmpTest_ExternalCode_Compiled.rex tmpTest_ExternalCode_CompiledAndEncoded.rex"

  -- samples/ (ooRexx installations)
  exceptions ||=  " MSInternetExplorer_search.rex"

  -- Experimental features of the Rexx Parser
  exceptions ||=  " extends.rex tables.rex"

  extension = "REX"

  Loop filename Over exceptions~makeArray(" ")
    exception.extension.filename = 1
  End

  -- Exceptions for .testgroup
  ----------------------

  exceptions = "PARSE.testGroup"

  extension = "TESTGROUP"

  Loop filename Over exceptions~makeArray(" ")
    exception.extension.filename = 1
  End

  -- Exceptions for .rxj
  ----------------------

  exceptions = "swing_buttons1.rxj swing_buttons2.rxj" -- Real error, invalid template

  extension = "RXJ"

  Loop filename Over exceptions~makeArray(" ")
    exception.extension.filename = 1
  End

  Loop extension Over extensions~makeArray(" ")
    extension = Upper(extension)
    Call SysFileTree "*."extension, "TREE", SysFileTreeOptions
    If extension == "RXU" Then options? = "-u" option
    Else options? = option
    options? = Strip(options?)
    If itrace Then options? = "-it" options?
    options? = Strip(options?)
    Loop i = 1 To tree.0
      -- If tree.i contains whitespace, enclose it between quotes
      If Space(tree.i,0) \== tree.i Then tree.i = '"'tree.i'"'
      name = FileSpec("N",tree.i)
      If exception.extension.name Then Iterate

      Say "Checking" tree.i"..."
      Say "--> Elements"
      Call ElIdent options? tree.i
      If result \== 0 Then Exit 1
      Say "--> Tree"
      Call TrIdent options? tree.i
      If result \== 0 Then Exit 1
    End
  End

  Exit 0

--------------------------------------------------------------------------------

Error:
 .Error~Say(Arg(1))
  Exit 1

--------------------------------------------------------------------------------

Help:
  Say .Resources[Help]~makeString        -
    ~caselessChangeStr("myName", myName) -
    ~caselessChangeStr("myHelp", myHelp)
  Exit 1

--------------------------------------------------------------------------------

::Resource Help End "::End"
myname -- Run identity tests against a collection of files

Usage:
  [rexx] myname [OPTIONS...] ["start"]

If the only option is -h or --help, or if no arguments are present,
then display this help and exit.

Options:
  -h,   --help           Display this help
  -xtr, --executor       Support Executor syntax
  -it, --itrace          Print internal traceback on error
  -nc, --nocls           Don't analyze .cls files
  -ne, --noelements      Don't run the elident test
  -nr, --norex, --norexx Don't analyze .rex files
  -nt, --notree          Don't run the trident test
  
If you specify "start", the myname tests are started; otherwise, this
help is displayed.

The 'myname' program is part of the Rexx Parser package,
see https://rexx.epbcn.com/rexx-parser/. It is distributed under
the Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0).

Copyright (c) 2024-2026 Josep Maria Blasco <josep.maria.blasco@epbcn.com>.

See myhelp for details.
::End