% \iffalse
%% (C) Copyright 2000-2005  LaTeX3 Project
%%
%% It may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3a of this
%% license or (at your option) any later version.  The latest version
%% of this license is in the file
%%
%%    http://www.latex-project.org/lppl.txt
%%
%% This file is part of the ``xbase bundle'' (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%%
%% The released version of this bundle is available from CTAN.
%%
%% -----------------------------------------------------------------------
%%
%% The development version of the bundle can be found at
%%
%%    http://www.latex-project.org/cgi-bin/cvsweb.cgi/
%%
%% for those people who are interested.
%%
%%%%%%%%%%%
%% NOTE: %%
%%%%%%%%%%%
%%
%%   Snapshots taken from the repository represent work in progress and may
%%   not work or may contain conflicting material!  We therefore ask
%%   people _not_ to put them into distributions, archives, etc. without
%%   prior consultation with the LaTeX Project Team.
%%
%% -----------------------------------------------------------------------
%%
%% $Id: xparse-test.tex 546 2006-07-06 14:54:38Z morten $
%%
% \fi
%

\documentclass{minimal}

\usepackage{xparse,l3box}


\typeout{Testing the complicated makebox setup}
\typeout{*****************************}
\typeout{* look at dvi output for this part}
\typeout{*****************************}

\CodeStart
%  We use \ReDeclareDocumentCommand as these are already defined.
%  Let's just take the error messages for a ride:
\def:Npn \makebox{}
% Here should be an error because it is defined
\DeclareDocumentCommand \makebox {m}{Gobbledygook}
\cs_gundefine:N \makebox
% And now one for being undefined
\ReDeclareDocumentCommand \makebox {m}{More~gobbledygook}
\let:NN \makebox \scan_stop:
% Another one for being undefined
\ReDeclareDocumentCommand \makebox {m}{Even~more~gobbledygook}
%  Now it should work
\DeclareDocumentCommand \makebox { C{\NoValue} o O{c} m}
 {
  \IfNoValueTF{#1}
     { \ltx@maketextbox{#2}{#3}{#4}\mbox }
     { \ltx@makepicbox #1  {#2}{#4}\@firstofone }
 }

\ReDeclareDocumentCommand \framebox { C{\NoValue} o O{c} m}
 {
  \IfNoValueTF{#1}
     { \ltx@maketextbox{#2}{#3}{#4}\fbox }
     { \ltx@makepicbox #1  {#2}{#4}\frame }
 }

\def\ltx@maketextbox#1#2#3#4{
  \IfNoValueTF{#1}
  {#4{#3}}
  {
    \leavevmode
    \@begin@tempboxa\hbox{#3}
    \setlength\@tempdima{#1}
    \if_meaning:NN #4\fbox
      \setbox\@tempboxa\hb@xt@\@tempdima{
        \kern\fboxsep
        \use:c{bm@#2}
        \kern\fboxsep
      }
      \@frameb@x{\kern-\fboxrule}
    \else:
      \hb@xt@\@tempdima{\use:c{bm@#2}}
    \fi:
    \@end@tempboxa
  }
}

\def\ltx@makepicbox#1#2#3#4#5{
  #5
  {
    \vbox to#2\unitlength {
      \let:NN \mb@b\vss \let:NN \mb@l\hss
      \let:NN \mb@r\hss \let:NN \mb@t\vss
      \IfNoValueF{#3}{
        \tlist_map_variable:nNn {#3}\l_tmpa_tlp {
          \if:w s\l_tmpa_tlp
            \let:NN \mb@l \scan_stop:
            \let:NN \mb@r \scan_stop:
          \else:
            \let:cN {mb@\l_tmpa_tlp}\scan_stop:
          \fi:
        }
     }
      \mb@t
      \hb@xt@ #1\unitlength{\mb@l #4\mb@r}
      \mb@b
      \kern\z@
    }
  }
}

\DeclarePseudoArgument{boxtest}{1}
{Before:~`#1',\hbox_set_inline_begin:N \l_tmpa_box }
{\hbox_set_inline_end: \space  the~ box:~
  \hbox_unpack_clear:N\l_tmpa_box ,~
  After:~`#1'}
\DeclareDocumentCommand\sillyboxtest{m}{
  Testing~#1:~\UsePseudoArgument{boxtest}{#1}
}


\def:Npn \showgrabbedargs{\showthe\l_xparse_grabbed_args_toks}
\CodeStop

\begin{document}


\thicklines

\makebox{A}
\makebox(1,2){B}
\makebox(0,0)[lt]{C}
\makebox[20pt]{D}
\makebox[30pt][r]{E}

\vspace{1cm}


\framebox{A}
\framebox(1,2){B}
\framebox(0,0)[lt]{C}
\framebox[20pt]{D}
\framebox[30pt][r]{E}


\typeout{Testing optional coordinates}

\DeclareDocumentCommand \foo { mmo }
{ \typeout{1:#1}
  \typeout{2:#2}
}

\show\foo

\ReDeclareDocumentCommand \foo { m C{{0}{0}} m }
{ \typeout{1:#1}
  \typeout{2:#2}
  \typeout{3:#3}
}

\show\foo

\foo A (1,2) B

\foo A B

\typeout{Testing mandatory coordinates (gives error on second examples)}

\ReDeclareDocumentCommand \foo { m c m }
{ \typeout{1:#1}
  \typeout{2:#2}
  \typeout{3:#3}
}

\show\foo

\foo A (1,2) B

\foo A B

\typeout{Testing normal optional arguments}


\ReDeclareDocumentCommand \foo { mmmm o mm o }
{ \typeout{1:#1}
  \typeout{2:#2}
  \typeout{3:#3}
  \typeout{4:#4}
  \typeout{5:#5}
  \typeout{6:#6}
  \typeout{7:#7}
  \typeout{8:#8}
}

\foo 1234[5]67[8]
\foo 123467

\show\foo
\expandafter\show\csname\string\foo\endcsname


\typeout{Testing optional arguments with default}

\DeclareDocumentCommand \baz { O{?}mmm o mm m }
{ \typeout{1:#1}
  \typeout{2:#2}
  \typeout{3:#3}
  \typeout{4:#4}
  \typeout{5:#5}
  \typeout{6:#6}
  \typeout{7:#7}
  \typeout{8:#8}
}

\show\baz
\expandafter\show\csname\string\baz\endcsname

\baz [1]234[5]678
\showgrabbedargs
\baz 234678
\showgrabbedargs

%\tracingall\tracingassigns=1
\ReDeclareDocumentCommand \bar { mmmm mmmm m}
{ \typeout{1:#1}
  \typeout{2:#2}
  \typeout{3:#3}
  \typeout{4:#4}
  \typeout{5:#5}
  \typeout{6:#6}
  \typeout{7:#7}
  \typeout{8:#8}
  \typeout{9:#9}
}

\show\bar
\expandafter\show\csname\string\bar\endcsname

\bar 123456789
\showgrabbedargs

\DeclareDocumentCommand\chapter{soom}
{\typeout{a{#1}^^Jb{#2}^^Jc{#3}^^Jd{#4}^^Je}}

\show\chapter
\expandafter\show\csname\string\chapter\endcsname

\typeout{1:}
\chapter*[xxx][yyy]{zzz}

\typeout{2:}
\chapter[xxx][yyy]{zzz}

\typeout{3:}
\chapter*[xxx]{zzz}

\typeout{4:}
\typeout{\chapter*[xxx][yyy]{zzz}}



\typeout{Using pseudo arguments:}

\sillyboxtest{AB}{a\verb*+% $%&\+b}

\typeout{Testing environments with args passed to end env}
\typeout{****************}
\typeout{* This works only if xparse is compiled with `perhaps'
           docstrip guard}
\typeout{* This part of the code is not activated by default!}
\typeout{****************}



\ReDeclareDocumentCommand\chapter{soom}
{\typeout{a{#1}^^Jb{#2}^^Jc{#3}^^Jd{#4}^^Je}}

\DeclareDocumentEnvironment{hello}{ooo}
  {\typeout{B1(#1)^^JB2(#2)^^JB3(#3)^^J}}
  {\typeout{E1(#1)^^JE2(#2)^^JE3(#3)^^J}}


\show\hello
\expandafter\show\csname\string\hello\endcsname

\show\endhello
\expandafter\show\csname end\string\\hello\endcsname

\begin{hello}[abc][aabbcc]
\typeout{body}
\typeout{5:}
\chapter[xxx][yyy]{zzz}
\end{hello}

\begin{hello}[1]
\typeout{outer body}
\hello [2] \typeout{inner body} \endhello
\end{hello}

\stop
