All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dakusui.thincrest_pcond.validator.package-info Maven / Gradle / Ivy

The newest version!
/**
 * :ditaa-option-separation: false
 * :toc:
 * 
 * == Evaluator Mechanism
 * 
 * (t.b.d.)
 * 
 * == Message Formatting Mechanism
 * 
 * (t.b.d.)
 * 
 * 
 * == Report Format
 * 
 * A package to provide a value checker mechanism.
 * The `ValueChecker` consists of three parts.
 * 
 * `ExceptionComposer`:: An interface to compose appropriate exceptions from a given message.
 * `MessageComposer`:: An interface to compose appropriate messages for various purposes.
 * `ReportComposer`:: An interface to compose a report for a given failure.
 * 
 * These are designed replaceable independently.
 * 
 * 
 * The Figure. <> illustrates a high-level format of a failure report of `pcond-thincrest`, which is held by `ComparisonFailure`.
 * `getExpected` method of the exception returns expectation-side, while `getActual` method returns the other.
 * 
 * [[ReportFormat]]
 * [ditaa, width="80%"]
 * .Report Format of `pcond-thincrest`
 * ----
 *   Expectation side             Actual Value side
 * +----------------------------+----------------------------+
 * | Summary                    | Summary                    |
 * |                            |                            |
 * |                            |                            |
 * |                            |                            |
 * +----------------------------+----------------------------+
 * | Explanation [0]            | Explanation [0]            |
 * |                            |                            |
 * |                            |                            |
 * | Explanation [1]            | Explanation [1]            |
 * |                            |                            |
 * |                            |                            |
 * | Explanation [2]            | Explanation [2]            |
 * |                            |                            |
 * |                            |                            |
 * +----------------------------+----------------------------+
 * ----
 * 
 * === Summary Format
 * 
 * Each line of summary section follows this format
 * 
 * ----
 * ExplanationIndex InputSummary -> FormNameSummary -> OutputSummary
 * ----
 * 
 * `ExplanationIndex`::
 * An index to specify a detailed explanation.
 * The format of explanations will be discussed in <>.
 * `InputSummary`::
 * A summary of input value.
 * `FormNameSummary`::
 * A form (function or predicate) name summary.
 * If the same value is repeated more than once, this field will be left blank.
 * `OutputSummary`::
 * A summary of output value.
 * 
 * ==== Expectation Side
 * 
 * Following is an example of a summary part of a report for expectation side.
 * 
 * [[SummaryFormatExpectation]]
 * ----
 *     Book:[title:<...i appellantur.>] ->  transform:title        ->"De Bello Gallico"
 *     "De Bello Gallico"               ->  check:allOf            ->true
 *                                      ->    isNotNull            ->true
 * [0]                                  ->    transform:parseInt   ->(unknown)
 *     NumberFormatE... input s...ico"" ->    check:allOf          ->true
 *                                      ->      >=[10]             ->true
 *                                      ->      <[40]              ->true
 *     Book:[title:<...i appellantur.>] ->  transform:abstractText ->"Gallia est ...li appellantur."
 *     "Gallia est o...li appellantur." ->  check:allOf            ->true
 *                                      ->    not:isNull           ->false
 *                                      ->    transform:length     ->145
 *     145                              ->    check:allOf          ->true
 * [1]                                  ->      >=[200]            ->true
 *                                      ->      <[400]             ->true
 * 
 * ----
 * 
 * Note that some forms are marked "squashable" internally and such forms are squashed into the next line.
 * For instance a predicate `not` is marked squashable.
 * See <> Section for more details.
 * 
 * ===== `InputSummary` in Expectation Side
 * 
 * `InputSummary` in Expectation side always shows an actual value given to the form as input unless an exception is thrown.
 * If an exception is thrown by forms corresponding to the previous line, the thrown exception will be printed as `InputSummary`.
 * 
 * ===== OutputSummary in Expectation Side
 * 
 * For predicates, expected boolean values are printed unless an exception is thrown.
 * If a direct input of a predicate or a function is not available because of an exception, a string "(not evaluable)" is printed.
 * 
 * `and`, `or`, `allOf`, and `anyOf` predicates may have child predicates.
 * If one of those child predicates throws an exception, the parent will print a string "(not available)" will be printed.
 * 
 * For functions, its *actual input value* will be printed even in expectation side unless it throws an exception.
 * 
 * ==== Actual Value Side
 * 
 * [[SummaryFormatActualValue]]
 * ----
 *     Book:[title:]->  transform:title        ->"De Bello Gallico"
 *     "De Bello Gallico"               ->  check:allOf            ->(not available)
 *                                      ->    isNotNull            ->true
 * [0]                                  ->    transform:parseInt   ->NumberFormatE...ico""
 *     NumberFormatException:"Fo..ico"" ->    check:allOf          ->(not available)
 *                                      ->      >=[10]             ->(not evaluated)
 *                                      ->      <[40]              ->(not evaluated)
 *     Book:[title:]->  transform:abstractText ->"Gallia est ...li appellantur."
 *     "Gallia est o...li appellantur." ->  check:allOf            ->false
 *                                      ->    not:isNull           ->false
 *                                      ->    transform:length     ->145
 *     145                              ->    check:allOf          ->false
 * [1]                                  ->      >=[200]            ->false
 *                                      ->      <[400]             ->true
 * 
 * ----
 * 
 * [[SummarySquashing]]
 * ==== Summary Squashing
 * 
 * 
 * Results of some predicates are determined by other predicates like `allOf`, `not`.
 * If we print them in independent line always, the summary becomes much bigger and harder to read.
 * 
 * So, the `pcond` 's framework marks them `squashable` and print them in the same line with the predicate which its child.
 * 
 * For instance, a `not` predicate is printed as follows.
 * 
 * ----
 *                                      ->    not:isNull->false
 * ----
 * 
 * Following shows an example summary part before squashing:
 * 
 * .Before Squashing
 * ----
 *     "hello"                          ->transform     ->5
 *                                      ->length        ->5
 *     5                                ->check         ->true
 *                                      ->>[1]          ->true
 * ----
 * 
 * On the summary squashing happens in a way where:
 * 
 * - The first value is picked up for input
 * - The last value is picked up for output
 * 
 * That is, "FILO".
 * Form names are joined with `:`.
 * 
 * .Squashed
 * ----
 *     "hello"                          ->transform:length->5
 *     5                                ->check:>[1]      ->true
 * ----
 * 
 * Note that if a predicate marked `squashable` has more than one child, the squashing will not happen.
 * 
 * 
 * 
 * [[ExplanationFormat]]
 * === Explanation Format
 * 
 * When a leaf predicate or a function is actually evaluated, and it "fails", an explanation will be generated.
 * 
 * 
 * ==== Expectation Side
 * 
 * In the expectation side, just a form name is printed for predicates:
 * 
 * [[DetailFormatExpectation_predicate]]
 * .Expectation Explanation for a Predicate
 * ----
 *  .Detail of failure [1]
 *  ----
 *  >=[200]
 *  ----
 * ----
 * 
 * This is because the predicate, which is a leaf, itself describes the expectation for the input value.
 * 
 * Note that this feature has limitations as of `4.0.0-alpha2`.
 * See <> in the <> section.
 * 
 * For a function, a fixed string `-> returns a value` is appended additionally.
 * 
 * [[DetailFormatExpectation_function]]
 * .Expectation Explanation for a Function
 * ----
 * 
 *  .Detail of failure [0]
 *  ----
 *  transform:parseInt -> returns a value
 *  ----
 * ----
 * 
 * Also note that this feature has limitations as of `4.0.0-alpha2`.
 * See <> in the <> section.
 * 
 * 
 * ==== Actual Value Side
 * 
 * In the actual value side, the input value that broke the expectation of a form is explained.
 * 
 * [[DetailFormatActualValue_exceptionNotThrown]]
 * .Actual Value Explanation for a Predicate Mismatch
 * ----
 *  .Detail of failure [1]
 *  ----
 *  145
 *  ----
 * ----
 * 
 * If the form throws an exception, its stacktrace will be printed additionally.
 * 
 * [[DetailFormatActualValue_exceptionThrown]]
 * .Actual Value Explanation for a Thrown Exception
 * ----
 *  .Detail of failure [0]
 *  ----
 *  Input: 'De Bello Gallico'
 *  Input Type: java.lang.String
 *  Thrown Exception: 'java.lang.NumberFormatException'
 *  Exception Message: For input string: "De Bello Gallico"
 *      java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
 *      java.lang.Integer.parseInt(Integer.java:580)
 *      java.lang.Integer.parseInt(Integer.java:615)
 *      com.github.dakusui.thincrest_pcond.core.printable.PrintableFunction.applyFunction (PrintableFunction.java:73)
 *      com.github.dakusui.thincrest_pcond.core.currying.CurriedFunction.apply(CurriedFunction.java:17)
 *      com.github.dakusui.thincrest_pcond.core.Evaluator$Impl.evaluate(Evaluator.java:357)
 * 
 *  ----
 * ----
 * 
 * 
 * [[Limitations]]
 * === Limitations
 * 
 * - [[ExpectedValueNotShown]] Expected Value is not shown in an explanation.
 * - [[SquashedNameNotShown]] Squashed form name is not shown in an explanation.
 * 
 */
package com.github.dakusui.thincrest_pcond.validator;




© 2015 - 2025 Weber Informatics LLC | Privacy Policy