<?xml version="1.0"?>
<!--
  Tests semantic analysis for symbol generation

  Copyright (C) 2014-2023 Ryan Specialty, LLC.

    This file is part of TAME.

    TAME 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/>.
-->
<description xmlns="http://www.jenitennison.com/xslt/xspec"
             xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
             xmlns:x="http://www.jenitennison.com/xslt/xspec"
             xmlns:lv="http://www.lovullo.com/rater"
             xmlns:preproc="http://www.lovullo.com/rater/preproc"
             xmlns:foo="http://www.lovullo.com/_junk"
             stylesheet="../../src/symtable/symbols.xsl">


  <scenario label="lv:param">
    <context mode="preproc:symtable">
      <lv:param name="foo_bar"
                type="footype"
                desc="Vector param"
                set="vector" />

      <lv:param name="tex_param"
                type="tex"
                desc="Matrix param with TeX"
                set="matrix"
                sym="\tex" />

      <lv:param name="scalar_param"
                type="bar"
                desc="Scalar param (implicit)" />

      <lv:param name="scalar_param_explicit"
                type="bar"
                set="scalar"
                desc="Scalar param (explicit)" />

      <lv:param name="unknown_dim"
                type="wtf"
                set="calabi-yau"
                desc="Unknown dimension" />
    </context>

    <expect label="derives symbol data from param">
      <preproc:sym type="param"
                   name="foo_bar"
                   dim="1"
                   desc="Vector param"
                   dtype="footype"
                   default=""
                   tex="" />

      <preproc:sym type="param"
                   name="tex_param"
                   dim="2"
                   desc="Matrix param with TeX"
                   dtype="tex"
                   default=""
                   tex="\tex" />

      <preproc:sym type="param"
                   name="scalar_param"
                   dim="0"
                   desc="Scalar param (implicit)"
                   dtype="bar"
                   default=""
                   tex="" />

      <preproc:sym type="param"
                   name="scalar_param_explicit"
                   dim="0"
                   desc="Scalar param (explicit)"
                   dtype="bar"
                   default=""
                   tex="" />

      <preproc:sym type="param"
                   name="unknown_dim"
                   dim="-1"
                   desc="Unknown dimension"
                   dtype="wtf"
                   default=""
                   tex="" />
    </expect>
  </scenario>

  <scenario label="lv:template">
    <context mode="preproc:symtable">
      <lv:template name="_foo_"
                   desc="Test template">
        <foo:ignored-content />
      </lv:template>
    </context>

    <expect label="derives symbol data from template">
      <preproc:sym type="tpl"
                   name="_foo_"
                   dim="0"
                   desc="Test template" />
    </expect>
  </scenario>


  <scenario label="lv:meta">
    <context mode="preproc:symtable">
      <lv:meta>
        <lv:prop name="prop1">
          <lv:const value="ignore" />
        </lv:prop>

        <lv:prop name="prop2">
          <lv:const value="ignore" />
        </lv:prop>
      </lv:meta>
    </context>

    <expect label="derives symbols from properties">
      <preproc:sym type="meta"
                   name=":meta:prop1"
                   desc="Metavalue prop1"
                   pollute="true"
                   no-deps="true" />
      <preproc:sym type="meta"
                   name=":meta:prop2"
                   desc="Metavalue prop2"
                   pollute="true"
                   no-deps="true" />
    </expect>
  </scenario>
</description>
