<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Class: Expect</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" /> <script type="text/javascript"> // <![CDATA[ function popupCode( url ) { window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400") } function toggleCode( id ) { if ( document.getElementById ) elem = document.getElementById( id ); else if ( document.all ) elem = eval( "document.all." + id ); else return false; elemStyle = elem.style; if ( elemStyle.display != "block" ) { elemStyle.display = "block" } else { elemStyle.display = "none" } return true; } // Make codeblocks hidden by default document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" ) // ]]> </script> </head> <body> <div id="classHeader"> <table class="header-table"> <tr class="top-aligned-row"> <td><strong>Class</strong></td> <td class="class-name-in-header">Expect</td> </tr> <tr class="top-aligned-row"> <td><strong>In:</strong></td> <td> <a href="../files/lib/carat/expect_rb.html"> lib/carat/expect.rb </a> <br /> </td> </tr> <tr class="top-aligned-row"> <td><strong>Parent:</strong></td> <td> <a href="Object.html"> Object </a> </td> </tr> </table> </div> <!-- banner header --> <div id="bodyContent"> <div id="contextContent"> <div id="description"> <h1><a href="Expect.html">Expect</a></h1> <p> Given an <a href="IO.html">IO</a> object, read data from that object and expect certain data. </p> <p> All expected data is expected in ‘chains’. When a message is received, it is compared to the pattern at the top of each chain. If it matches one of the patterns, then all is well, but an error message is printed otherwise. </p> <p> A message can match patterns in more than one chain. </p> <h2>Synopsis</h2> <pre> require 'carat/expect' # to do </pre> <h2>Legal</h2> <p> Adopted from Ruby Treasures 0.4 Copyright (C) 2002 Paul Brannan <paul@atdesk.com> </p> <p> You may distribute this software under the same terms as Ruby (see the file COPYING that was distributed with this library). </p> <h2>History</h2> <pre> $Id: expect.rb, v0.4 2004/11/30 transami Exp $ </pre> </div> </div> <div id="method-list"> <h3 class="section-bar">Methods</h3> <div class="name-list"> <a href="#M000147">expect</a> <a href="#M000150">handle_event</a> <a href="#M000151">handle_line</a> <a href="#M000148">ignore</a> <a href="#M000145">new</a> <a href="#M000146">reset</a> <a href="#M000149">run</a> </div> </div> </div> <!-- if includes --> <div id="section"> <div id="class-list"> <h3 class="section-bar">Classes and Modules</h3> Class <a href="Expect/DefaultChain.html" class="link">Expect::DefaultChain</a><br /> Class <a href="Expect/SeparatedPattern.html" class="link">Expect::SeparatedPattern</a><br /> Class <a href="Expect/Timeout.html" class="link">Expect::Timeout</a><br /> Class <a href="Expect/UnmatchedMessage.html" class="link">Expect::UnmatchedMessage</a><br /> </div> <div id="constants-list"> <h3 class="section-bar">Constants</h3> <div class="name-list"> <table summary="Constants"> <tr class="top-aligned-row context-row"> <td class="context-item-name">VERSION</td> <td>=</td> <td class="context-item-value">"0.4"</td> </tr> </table> </div> </div> <div id="attribute-list"> <h3 class="section-bar">Attributes</h3> <div class="name-list"> <table> <tr class="top-aligned-row context-row"> <td class="context-item-name">timeout</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"> It is highly recommended that this be an immutable object. </td> </tr> </table> </div> </div> <!-- if method_list --> <div id="methods"> <h3 class="section-bar">Public Class methods</h3> <div id="method-M000145" class="method-detail"> <a name="M000145"></a> <div class="method-heading"> <a href="#M000145" class="method-signature"> <span class="method-name">new</span><span class="method-args">(io_object, reactor)</span> </a> </div> <div class="method-description"> <p> Create a new Expect_Test object. </p> <p> @param io_object an <a href="IO.html">IO</a> object to read from. @param reactor a reactor to use </p> <p><a class="source-toggle" href="#" onclick="toggleCode('M000145-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000145-source"> <pre> <span class="ruby-comment cmt"># File lib/carat/expect.rb, line 114</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">io_object</span>, <span class="ruby-identifier">reactor</span>) <span class="ruby-ivar">@io_object</span> = <span class="ruby-identifier">io_object</span> <span class="ruby-ivar">@reactor</span> = <span class="ruby-identifier">reactor</span> <span class="ruby-ivar">@reactor</span>.<span class="ruby-identifier">register_read</span>(<span class="ruby-ivar">@io_object</span>, <span class="ruby-identifier">method</span>(<span class="ruby-identifier">:handle_event</span>)) <span class="ruby-identifier">reset</span>() <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <h3 class="section-bar">Public Instance methods</h3> <div id="method-M000147" class="method-detail"> <a name="M000147"></a> <div class="method-heading"> <a href="#M000147" class="method-signature"> <span class="method-name">expect</span><span class="method-args">(pattern, chain=DefaultChain)</span> </a> </div> <div class="method-description"> <p> <a href="Expect.html">Expect</a> a message matching pattern in a certain chain. </p> <p> @param pattern the pattern to expect. @param chain the chain in which to expect the message. </p> <p><a class="source-toggle" href="#" onclick="toggleCode('M000147-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000147-source"> <pre> <span class="ruby-comment cmt"># File lib/carat/expect.rb, line 136</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">expect</span>(<span class="ruby-identifier">pattern</span>, <span class="ruby-identifier">chain</span>=<span class="ruby-constant">DefaultChain</span>) <span class="ruby-ivar">@expect_chain</span>[<span class="ruby-identifier">chain</span>] <span class="ruby-operator">||=</span> <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span> <span class="ruby-ivar">@expect_chain</span>[<span class="ruby-identifier">chain</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">pattern</span>) <span class="ruby-ivar">@expects_left</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div id="method-M000150" class="method-detail"> <a name="M000150"></a> <div class="method-heading"> <a href="#M000150" class="method-signature"> <span class="method-name">handle_event</span><span class="method-args">(io_object)</span> </a> </div> <div class="method-description"> <p><a class="source-toggle" href="#" onclick="toggleCode('M000150-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000150-source"> <pre> <span class="ruby-comment cmt"># File lib/carat/expect.rb, line 163</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">handle_event</span>(<span class="ruby-identifier">io_object</span>) <span class="ruby-identifier">handle_line</span>(<span class="ruby-identifier">io_object</span>.<span class="ruby-identifier">gets</span>()) <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div id="method-M000151" class="method-detail"> <a name="M000151"></a> <div class="method-heading"> <a href="#M000151" class="method-signature"> <span class="method-name">handle_line</span><span class="method-args">(line)</span> </a> </div> <div class="method-description"> <p><a class="source-toggle" href="#" onclick="toggleCode('M000151-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000151-source"> <pre> <span class="ruby-comment cmt"># File lib/carat/expect.rb, line 167</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">handle_line</span>(<span class="ruby-identifier">line</span>) <span class="ruby-identifier">line</span>.<span class="ruby-identifier">chomp!</span>() <span class="ruby-comment cmt"># Check each element in the ignore chain</span> <span class="ruby-keyword kw">for</span> <span class="ruby-identifier">pattern</span> <span class="ruby-keyword kw">in</span> <span class="ruby-ivar">@ignore_chain</span> <span class="ruby-keyword kw">do</span> <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">line</span> <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># Check the first element of each expect chain to see if</span> <span class="ruby-comment cmt"># the message matches</span> <span class="ruby-identifier">match</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">for</span> <span class="ruby-identifier">key</span>, <span class="ruby-identifier">chain</span> <span class="ruby-keyword kw">in</span> <span class="ruby-ivar">@expect_chain</span> <span class="ruby-keyword kw">do</span> <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">chain</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">chain</span>.<span class="ruby-identifier">first</span>() <span class="ruby-operator">===</span> <span class="ruby-identifier">line</span> <span class="ruby-keyword kw">then</span> <span class="ruby-identifier">chain</span>.<span class="ruby-identifier">shift</span>() <span class="ruby-ivar">@expects_left</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span> <span class="ruby-identifier">match</span> = <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">throw</span> <span class="ruby-identifier">:expect_loop_done</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@expects_left</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-identifier">raise</span> <span class="ruby-constant">UnmatchedMessage</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">line</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">match</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div id="method-M000148" class="method-detail"> <a name="M000148"></a> <div class="method-heading"> <a href="#M000148" class="method-signature"> <span class="method-name">ignore</span><span class="method-args">(pattern)</span> </a> </div> <div class="method-description"> <p> Ignore a pattern in all chains. </p> <p> @param pattern the pattern to ignore. </p> <p><a class="source-toggle" href="#" onclick="toggleCode('M000148-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000148-source"> <pre> <span class="ruby-comment cmt"># File lib/carat/expect.rb, line 147</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">ignore</span>(<span class="ruby-identifier">pattern</span>) <span class="ruby-ivar">@ignore_chain</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">pattern</span>) <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div id="method-M000146" class="method-detail"> <a name="M000146"></a> <div class="method-heading"> <a href="#M000146" class="method-signature"> <span class="method-name">reset</span><span class="method-args">()</span> </a> </div> <div class="method-description"> <p> Reset the the ignore chain and all expect chains. </p> <p><a class="source-toggle" href="#" onclick="toggleCode('M000146-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000146-source"> <pre> <span class="ruby-comment cmt"># File lib/carat/expect.rb, line 124</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">reset</span>() <span class="ruby-ivar">@expect_chain</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span> <span class="ruby-ivar">@ignore_chain</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span> <span class="ruby-ivar">@expects_left</span> = <span class="ruby-value">0</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div id="method-M000149" class="method-detail"> <a name="M000149"></a> <div class="method-heading"> <a href="#M000149" class="method-signature"> <span class="method-name">run</span><span class="method-args">(timeout = nil)</span> </a> </div> <div class="method-description"> <p><a class="source-toggle" href="#" onclick="toggleCode('M000149-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000149-source"> <pre> <span class="ruby-comment cmt"># File lib/carat/expect.rb, line 151</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">run</span>(<span class="ruby-identifier">timeout</span> = <span class="ruby-keyword kw">nil</span>) <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@expects_left</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-identifier">catch</span> <span class="ruby-identifier">:expect_loop_done</span> <span class="ruby-keyword kw">do</span> <span class="ruby-ivar">@reactor</span>.<span class="ruby-identifier">run_event_loop</span>(<span class="ruby-identifier">timeout</span>) <span class="ruby-keyword kw">for</span> <span class="ruby-identifier">key</span>, <span class="ruby-identifier">chain</span> <span class="ruby-keyword kw">in</span> <span class="ruby-ivar">@expect_chain</span> <span class="ruby-keyword kw">do</span> <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">chain</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-identifier">raise</span> <span class="ruby-constant">Timeout</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">chain</span>.<span class="ruby-identifier">first</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># TODO: What does it mean if we got here?</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> </div> </div> <div id="validator-badges"> <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p> </div> </body> </html>