]> Creatis software - CreaPhase.git/blob - octave_packages/m/testfun/demo.m
update packages
[CreaPhase.git] / octave_packages / m / testfun / demo.m
1 ## Copyright (C) 2000-2012 Paul Kienzle
2 ##
3 ## This file is part of Octave.
4 ##
5 ## Octave is free software; you can redistribute it and/or modify it
6 ## under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 3 of the License, or (at
8 ## your option) any later version.
9 ##
10 ## Octave is distributed in the hope that it will be useful, but
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 ## General Public License for more details.
14 ##
15 ## You should have received a copy of the GNU General Public License
16 ## along with Octave; see the file COPYING.  If not, see
17 ## <http://www.gnu.org/licenses/>.
18
19 ## -*- texinfo -*-
20 ## @deftypefn  {Command} {} demo @var{name}
21 ## @deftypefnx {Command} {} demo @var{name} @var{n}
22 ## @deftypefnx {Function File} {} demo ('@var{name}')
23 ## @deftypefnx {Function File} {} demo ('@var{name}', @var{n})
24 ##
25 ## Run example code block @var{n} associated with the function @var{name}.
26 ## If @var{n} is not specified, all examples are run.
27 ##
28 ## Examples are stored in the script file, or in a file with the same
29 ## name but no extension located on Octave's load path.  To keep examples
30 ## separate from regular script code, all lines are prefixed by @code{%!}.  Each
31 ## example must also be introduced by the keyword 'demo' flush left to the
32 ## prefix with no intervening spaces.  The remainder of the example can
33 ## contain arbitrary Octave code.  For example:
34 ##
35 ## @example
36 ## @group
37 ## %!demo
38 ## %! t=0:0.01:2*pi; x = sin (t);
39 ## %! plot (t,x)
40 ## %! %-------------------------------------------------
41 ## %! % the figure window shows one cycle of a sine wave
42 ## @end group
43 ## @end example
44 ##
45 ## Note that the code is displayed before it is executed, so a simple
46 ## comment at the end suffices for labeling what is being shown.  It is
47 ## generally not necessary to use @code{disp} or @code{printf} within the demo.
48 ##
49 ## Demos are run in a function environment with no access to external
50 ## variables.  This means that every demo must have separate initialization
51 ## code.  Alternatively, all demos can be combined into a single large demo
52 ## with the code
53 ##
54 ## @example
55 ## %! input("Press <enter> to continue: ","s");
56 ## @end example
57 ##
58 ## @noindent
59 ## between the sections, but this is discouraged.  Other techniques
60 ## to avoid multiple initialization blocks include using multiple plots
61 ## with a new @code{figure} command between each plot, or using @code{subplot}
62 ## to put multiple plots in the same window.
63 ##
64 ## Also, because demo evaluates within a function context, you cannot
65 ## define new functions inside a demo.  If you must have function blocks,
66 ## rather than just anonymous functions or inline functions, you will have to
67 ## use @code{eval(example('function',n))} to see them.  Because eval only
68 ## evaluates one line, or one statement if the statement crosses
69 ## multiple lines, you must wrap your demo in "if 1 <demo stuff> endif"
70 ## with the 'if' on the same line as 'demo'.  For example:
71 ##
72 ## @example
73 ## @group
74 ## %!demo if 1
75 ## %!  function y=f(x)
76 ## %!    y=x;
77 ## %!  endfunction
78 ## %!  f(3)
79 ## %! endif
80 ## @end group
81 ## @end example
82 ##
83 ## @seealso{test, example}
84 ## @end deftypefn
85
86 ## FIXME: modify subplot so that gnuplot_has_multiplot == 0 causes it to
87 ## use the current figure window but pause if not plotting in the
88 ## first subplot.
89
90 function demo (name, n)
91
92   if (nargin < 1 || nargin > 2)
93     print_usage ();
94   endif
95
96   if (nargin < 2)
97     n = 0;
98   elseif (ischar (n))
99     n = str2double (n);
100   endif
101
102   [code, idx] = test (name, "grabdemo");
103   if (isempty (idx))
104     warning ("no demo available for %s", name);
105     return;
106   elseif (n >= length (idx))
107     warning ("only %d demos available for %s", length (idx) - 1, name);
108     return;
109   endif
110
111   if (n > 0)
112     doidx = n;
113   else
114     doidx = 1:length(idx)-1;
115   endif
116   for i = 1:length (doidx)
117     ## Pause between demos
118     if (i > 1)
119       input ("Press <enter> to continue: ", "s");
120     endif
121
122     ## Process each demo without failing
123     try
124       block = code(idx(doidx(i)):idx(doidx(i)+1)-1);
125       ## FIXME: need to check for embedded test functions, which cause
126       ## segfaults, until issues with subfunctions in functions are resolved.
127       embed_func = regexp (block, '^\s*function ', 'once', 'lineanchors');
128       if (isempty (embed_func))
129         ## Use an environment without variables
130         eval (cstrcat ("function __demo__()\n", block, "\nendfunction"));
131         ## Display the code that will be executed before executing it
132         printf ("%s example %d:%s\n\n", name, doidx(i), block);
133         __demo__;
134       else
135         error (["Functions embedded in %!demo blocks are not allowed.\n", ...
136                 "Use the %!function/%!endfunction syntax instead to define shared functions for testing.\n"]);
137       endif
138     catch
139       ## Let the programmer know which demo failed.
140       printf ("%s example %d: failed\n%s\n", name, doidx(i), lasterr ());
141     end_try_catch
142     clear __demo__;
143   endfor
144
145 endfunction
146
147 %!demo
148 %! t=0:0.01:2*pi; x = sin(t);
149 %! plot (t,x)
150 %! %-------------------------------------------------
151 %! % the figure window shows one cycle of a sine wave
152
153 %!error demo ();
154 %!error demo (1, 2, 3);