<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>В поисках успеха &#187; flash</title>
	<atom:link href="http://sheremetov.com/category/flash/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Tue, 03 Jan 2012 21:36:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Перевод документации к PureMVC</title>
		<link>http://sheremetov.com/flash/puremvc-translation/</link>
		<comments>http://sheremetov.com/flash/puremvc-translation/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 18:10:18 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[translation]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=760</guid>
		<description><![CDATA[Какое-то время тому назад, мы с группой энтузиастов: Романом Павленко Денисом “Barmaleychik” Волохом Дмитрием “Reijii” Кочетовым Ростиславом “RostislavR” Сирыком cделали перевод документации к PureMVC а Клифф Холл опубликовал. Со временем в переводе было найдено массу огрехов, благодаря читателям flash-ripper.com но обновленный документ развалил нам структуру вордовского документа, который Клифф использует для конвертации документации в pdf, [...]]]></description>
			<content:encoded><![CDATA[<p>Какое-то время тому назад, мы с группой энтузиастов:</p>
<ul>
<li>Романом Павленко</li>
<li><a href="http://denisvolokh.blogspot.com/">Денисом “Barmaleychik” Волохом</a></li>
<li><a href="http://reijii.solartxit.com/">Дмитрием “Reijii” Кочетовым</a></li>
<li><a href="http://flash-ripper.com/">Ростиславом “RostislavR” Сирыком</a></li>
</ul>
<p>cделали перевод документации к <a href="http://puremvc.org/">PureMVC</a> а Клифф Холл опубликовал.
</p>
<p>Со временем в переводе было найдено массу огрехов, благодаря читателям <a href="http://flash-ripper.com/">flash-ripper.com</a> но обновленный документ развалил нам структуру вордовского документа, который Клифф использует для конвертации документации в pdf, и окончательно опустив руки в борьбе с Microsoft Word исправленный перевод был закинут в долгий ящик. Недавно, разгребая завалы неоконченных дел, я нашел этот документ и решил опубликовать его хотя бы в блоге, - надеюсь ищущие найдут его тут. </p>
<p>Перевод не ограничен действиями лицензий - вы можете печатать его, давать почитать друзьям, изменять его как вам заблагорассудится и даже продавать. Прочитать его можно <a href="http://sheremetov.com/puremvc">тут</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/puremvc-translation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа Garbage Collector в Flash Player</title>
		<link>http://sheremetov.com/flash/garbage-collector-in-flash-player/</link>
		<comments>http://sheremetov.com/flash/garbage-collector-in-flash-player/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 07:36:16 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=547</guid>
		<description><![CDATA[Это будет короткий пост об особенностях работы GarbageCollector (сборщик мусора), некоторые из которых были для меня новостью. Во-первых давайте напишем следующий код: &#160; import flash.display.Sprite; &#160; function onFrame&#40;e: Event&#41; &#123; trace&#40;System.totalMemory&#41;; var test = new Sprite&#40;&#41;; &#125; &#160; addEventListener&#40;Event.ENTER_FRAME, onFrame&#41; &#160; Запустив его вы убедитесь что плеер выделяет всё больше и больше памяти для себя, [...]]]></description>
			<content:encoded><![CDATA[<p>Это будет короткий пост об особенностях работы GarbageCollector (сборщик мусора), некоторые из которых были для меня новостью. Во-первых давайте напишем следующий код:</p>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> onFrame<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>: Event<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">System</span>.<span style="color: #006600;">totalMemory</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">var</span> test = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
addEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ENTER_FRAME</span>, onFrame<span style="color: #66cc66;">&#41;</span>
&nbsp;</pre>
<p>Запустив его вы убедитесь что плеер выделяет всё больше и больше памяти для себя, и спустя какое-то время, - начинает освобождать. То есть, память очищается не сразу же, как только на объект все ссылки удалены, а только через какое-то время. Графически это выглядит так:</p>
<p><img src="http://sheremetov.com/wp-content/uploads/2010/02/gc-chart.gif" alt="gc-chart" title="gc-chart" width="600" height="308" class="alignnone size-full wp-image-549" /></p>
<p>Сборку мусора можно запустить принудительно в debug версии плеера так: </p>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">System</span>.<span style="color: #006600;">gc</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;</pre>
<p>А в обычном плеере, можно воспользоваться хаком:</p>
<pre class="actionscript">&nbsp;
<span style="color: #0066CC;">try</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">LocalConnection</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">connect</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'foo'</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">LocalConnection</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">connect</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'foo'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span> <span style="color: #0066CC;">catch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:<span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Можно сделать несколько выводов:</p>
<ol>
<li>Я не показал этого в коде, но на самом деле память начинала расходоваться только с объектов Sprite. Объекты классов int, Number, Object удалялись сразу же.</li>
<li>Мы не имеем контроля над управлением памятью, поэтому есть смысл делать пул объектов, запрашивая экземпляры нужных классов, по мере надобности, периодически подчищая пул. Таким образом мы по крайней мере будем удерживать количество занимаемой памяти, особенно в случае если большое количество объектов создается-удаляется (а в идеале избегать этого).</li>
<li>За памятью нужно постоянно следить, иначе потом будет очень непросто разобраться в чем именно проблема</li>
</ol>
<p>Более подробно про работу Garbage Collector можно прочитать в <a href="http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html">статье Гранта Скиннера</a>, он же, <a href="http://gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html">пишет про хак</a>, на своем сайте.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/garbage-collector-in-flash-player/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Использование FlexUnit для тестирования асинхронных вызовов</title>
		<link>http://sheremetov.com/flash/flexunit-async/</link>
		<comments>http://sheremetov.com/flash/flexunit-async/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 18:10:42 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[flexunit]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=514</guid>
		<description><![CDATA[Я немного писал уже о важности написания тестов, правда для php программистов, но написанное в равной степени касается любого программирования, если в разработку вовлечены более одного человека, релизы довольно часты и логика приложения не может быть протестирована вручную очень быстро. В  таком случае, мы рано или поздно захотим автоматизировать процесс, собственно об этом и пойдет [...]]]></description>
			<content:encoded><![CDATA[<p>Я немного писал уже о <a href="http://sheremetov.com/oop/test-driven-development/">важности написания тестов</a>, правда для php программистов, но написанное в равной степени касается любого программирования, если в разработку вовлечены более одного человека, релизы довольно часты и логика приложения не может быть протестирована вручную очень быстро. В  таком случае, мы рано или поздно захотим автоматизировать процесс, собственно об этом и пойдет речь. Тестировать приложения написанные на php мы научились, хотя конечно постиигать эту науку можно всю жизнь, но те задачи которые перед нами стояли мы с успехом решаем, благодаря UnitTest'ам, а вот с автоматизированным тестированием Flex/Flash, пока не складывалось. Появилось немного времени и было решено взглянуть на FlexUnit, и вот что из этого вышло.</p>
<p>Поскольку на flash/flex мы чаще всего делаем  интерфейсы, мне в первую очередь было интересно как тестировать асинхронные вызовы, элементы UI, и проч. Я написал небольшой класс, представляющий из себя сильно упрощенную версию конвеера <a href="http://potapenko.com">Жени Потапенко</a>. Вот код двух классов:</p>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// Task.as</span>
&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Task <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _func: <span style="color: #000000; font-weight: bold;">Function</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _time: <span style="color: #0066CC;">int</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _params: <span style="color: #0066CC;">Object</span>;		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Task<span style="color: #66cc66;">&#40;</span>func: <span style="color: #000000; font-weight: bold;">Function</span>, <span style="color: #0066CC;">time</span>: <span style="color: #0066CC;">int</span>, params: <span style="color: #0066CC;">Object</span> = <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			_func = func;
			_time = <span style="color: #0066CC;">time</span>;
			_params = params;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">caller</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0066CC;">caller</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> params<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _params;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">int</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _time;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> func<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #000000; font-weight: bold;">Function</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _func;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// Conveyor.as</span>
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">TimerEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Timer</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Conveyor <span style="color: #66cc66;">&#123;</span> 
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _queue: <span style="color: #0066CC;">Array</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _timer: Timer;
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _paused: <span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">false</span>;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Conveyor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			_queue = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			_timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			_timer.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, onTaskFinished<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span>task:Task<span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_queue.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span>task<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_timer.<span style="color: #0066CC;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>_queue.<span style="color: #0066CC;">length</span> &gt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> task: Task = _queue.<span style="color: #006600;">shift</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span> != <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					task.<span style="color: #006600;">func</span><span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
					task.<span style="color: #006600;">func</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				_timer.<span style="color: #006600;">delay</span> = task.<span style="color: #0066CC;">time</span>;
				_timer.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onTaskFinished<span style="color: #66cc66;">&#40;</span>event: TimerEvent<span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Первое с чего надо начать для тестирования этого кода это TestSuite и TestRunner, который будет его запускать:</p>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// ConveyorTestSuite.as</span>
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #66cc66;">&#91;</span>Suite<span style="color: #66cc66;">&#93;</span>
           <span style="color: #66cc66;">&#91;</span>RunWith<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;org.flexunit.runners.Suite&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConveyorTestSuite <span style="color: #66cc66;">&#123;</span>		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> conveyorTest: ConveyorTest;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> taskTest: TaskTest;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ConveyorTestSuite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Runner.mxml</p>
<pre class="actionscript">&nbsp;
&lt; ?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?&gt;
&lt;mx :Application
    xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span>
    xmlns:flexunit=<span style="color: #ff0000;">&quot;flexunit.flexui.*&quot;</span>
    xmlns:flexUnitUIRunner=<span style="color: #ff0000;">&quot;http://www.adobe.com/2009/flexUnitUIRunner&quot;</span>
    creationComplete=<span style="color: #ff0000;">&quot;creationCompleteHandler(event)&quot;</span>
&gt;
&lt;/mx&gt;&lt;mx :Script&gt;
		&lt; !<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
			<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span>.<span style="color: #006600;">ConveyorTestSuite</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">FlexEvent</span>;
&nbsp;
			<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">listeners</span>.<span style="color: #006600;">UIListener</span>;
			<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">runner</span>.<span style="color: #006600;">FlexUnitCore</span>;
&nbsp;
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> flexUnitCore:FlexUnitCore;
&nbsp;
			protected <span style="color: #000000; font-weight: bold;">function</span> creationCompleteHandler<span style="color: #66cc66;">&#40;</span>event:FlexEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
 				flexUnitCore = <span style="color: #000000; font-weight: bold;">new</span> FlexUnitCore<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
 				flexUnitCore.<span style="color: #0066CC;">addListener</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> UIListener<span style="color: #66cc66;">&#40;</span> testRunner <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
 				flexUnitCore.<span style="color: #006600;">run</span><span style="color: #66cc66;">&#40;</span> ConveyorTestSuite <span style="color: #66cc66;">&#41;</span>;
 			<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>&gt;
	&lt;/mx&gt;
	&lt;flexunituirunner :TestRunnerBase id=<span style="color: #ff0000;">&quot;testRunner&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> /&gt;
&lt; /mx:Application&gt;
&nbsp;</pre>
<p>Обратите внимание на теги метаданных, которыми могут конфигурироваться классы TestSuite и TestCase. Вот полный список, поддерживаемых метатегов:</p>
<ul>
<li>[Suite] - указывает на класс Suite</li>
<li>[Test] - указывает на метод теста, заменяет префикс test для метода. Поддерживает аттрибуты expected, async, order, timeout, ui</li>
<li>[RunWith] - указывает на Runner с которым должен быть запущен TestSuite</li>
<li>[Ignore] - Вместо комментирования метода теста достаточно указать этот метатег</li>
<li>[Before] - заменяет setup() во FlexUnit и позволяет использовать несколько методов. Поддерживает аттрибуты: async, timeout, order, ui.</li>
<li>[After] - заменяет teardown(), поддерживает: async, timeout, order and ui аттрибуты.</li>
<li>[BeforeClass] - позволяет определить метод, вызываемый перед запуском класса теста, поддерживает аттрибут order</li>
<li>[AfterClass] - помечает метод выполняемый, после запуска всех тестов в классе, поддерживает аттрибут order</li>
</ul>
<p>Тест класса Task представляет из себя классический unit-test:</p>
<pre class="actionscript">&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Task</span>;
	<span style="color: #0066CC;">import</span> flexunit.<span style="color: #006600;">framework</span>.<span style="color: #006600;">TestCase</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TaskTest <span style="color: #0066CC;">extends</span> TestCase <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> TaskTest<span style="color: #66cc66;">&#40;</span>methodName:<span style="color: #0066CC;">String</span>=<span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span>methodName<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testNew<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> param:<span style="color: #0066CC;">Object</span> = <span style="color: #66cc66;">&#123;</span>test:<span style="color: #ff0000;">&quot;passed&quot;</span><span style="color: #66cc66;">&#125;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> func:<span style="color: #000000; font-weight: bold;">Function</span> = testNew;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> task: Task = <span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>func, <span style="color: #cc66cc;">100</span>, param<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			assertTrue<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">func</span> == func<span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #0066CC;">time</span>, <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span>, param<span style="color: #66cc66;">&#41;</span>;			
&nbsp;
			task = <span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>func, <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
			assertNull<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span><span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #0066CC;">caller</span>, <span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>А вот класс для тестирования асинхронных вызовов выглядит интереснее:</p>
<pre class="actionscript">&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Conveyor</span>;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Task</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">Event</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">TimerEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Timer</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">asserts</span>.<span style="color: #006600;">assertEquals</span>;
	<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">async</span>.<span style="color: #006600;">Async</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConveyorTest <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> conveyor: Conveyor;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> counter: <span style="color: #0066CC;">int</span>;		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ConveyorTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Before<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> runBeforeEveryTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
		    conveyor = <span style="color: #000000; font-weight: bold;">new</span> Conveyor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		    counter = <span style="color: #cc66cc;">0</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>After<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> runAfterEveryTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			conveyor = <span style="color: #000000; font-weight: bold;">null</span>;
		<span style="color: #66cc66;">&#125;</span>       
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> dummy<span style="color: #66cc66;">&#40;</span>param: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			counter++;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Test<span style="color: #66cc66;">&#40;</span>async,timeout=<span style="color: #ff0000;">&quot;250&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testPlay<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
			conveyor.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>dummy, <span style="color: #cc66cc;">100</span>, <span style="color: #ff0000;">&quot;one&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> timer1: Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			timer1.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, Async.<span style="color: #006600;">asyncHandler</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">this</span>, onAfterFirst, <span style="color: #cc66cc;">120</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			timer1.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			conveyor.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>dummy, <span style="color: #cc66cc;">100</span>, <span style="color: #ff0000;">&quot;two&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;										
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> timer2: Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">150</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			timer2.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, Async.<span style="color: #006600;">asyncHandler</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">this</span>, onAfterSecond, <span style="color: #cc66cc;">220</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			timer2.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			conveyor.<span style="color: #0066CC;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onAfterSecond<span style="color: #66cc66;">&#40;</span>event: Event, params: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #66cc66;">&#125;</span>			
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onAfterFirst<span style="color: #66cc66;">&#40;</span>event: Event, params: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>В этом классе вызовы типа Async.asyncHandler( this, onAfterFirst, 120) возвращают callback, этот вызов в случае если вызов не произойдет в течении 120 миллисекунд, сработает таймаут, и тест будет считаться проваленным.<br />
Надеюсь код достаточно красноречив и понятен. А для тех кто захочет глубже разобраться с фреймворком, я рекомендую прочитать очень хорошую <a href="http://www.insideria.com/2009/05/flashbuilder4-will-support-fle.html">статью о использовании FlexUnit</a>, неисчерпаемым источником информации являются 220 мегабайт кода репозитория проекта, вы легко можете экспотрировать его скачав <a href="http://subversion.tigris.org/files/documents/15/39559/svn-1.4.5-setup.exe">svn</a>, и сделав:</p>
<pre>
svn checkout http://opensource.adobe.com/svn/opensource/flexunit [путь-куда-вы-хотите-экспортировать]
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/flexunit-async/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дайджест ссылок №6</title>
		<link>http://sheremetov.com/links/6/</link>
		<comments>http://sheremetov.com/links/6/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 07:05:53 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[ссылки]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=227</guid>
		<description><![CDATA[flex приложение, наглядно показывающее разницу в скорости выполнения типовых конструкций as3, с исходниками. Очень удобно и доходчиво. puremvc.tv, хороший ресурс для тех кто «стартует» с фреймворком puremvc. Напомню, что основное применение этот фреймворк нашел в flash/flex разработке, но также с успехом применяется и с java, .net, php, ruby, python. Ёмкий обзор флешовых движков для создания панорам на вашем сайте от Racer, гуру флеш разработки. Trevor McCauley [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://businessintelligence.me/projects/performance_tester/performanceTester.html">flex приложение</a>, наглядно показывающее разницу в скорости выполнения типовых конструкций <abbr title="Action Script 3">as3</abbr>, с исходниками. Очень удобно и доходчиво.</li>
<li><a href="http://puremvc.tv/">puremvc.tv</a>, хороший ресурс для тех кто «стартует» с фреймворком <a>puremvc</a>. Напомню, что основное применение этот фреймворк нашел в flash/flex разработке, но также с успехом применяется и с java, .net, php, ruby, python.</li>
<li><a href="http://racer242.blogspot.com/2009/06/flash.html">Ёмкий обзор флешовых движков для создания панорам</a> на вашем сайте от <a href="http://www.blogger.com/profile/13778770709453656580">Racer</a>, гуру флеш разработки.</li>
<li><a href="http://www.senocular.com/">Trevor McCauley</a> делится отличным <a href="http://www.senocular.com/?id=2.75">lifehack'ом</a>: если у вас установлена debug версия flash player, вы частенько можете наблюдать нежелательное окно отладки, в случае возникновения исключений (exceptions), во flash приложении. Подавить назойливое окно можно добавлением в <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=logging_04.html">mm.cfg</a> строки: «SuppressDebuggerExceptionDialogs=1».</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Дайджест ссылок №2</title>
		<link>http://sheremetov.com/links/2/</link>
		<comments>http://sheremetov.com/links/2/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 06:20:29 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[ссылки]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[catalyst]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[potapenko]]></category>
		<category><![CDATA[Асхат Уразбаев]]></category>
		<category><![CDATA[Джеэль Спольски]]></category>
		<category><![CDATA[Женя Потапенко]]></category>
		<category><![CDATA[мотивация]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=76</guid>
		<description><![CDATA[Менеджерское: Перевод отличной статьи Джеэля Спольски (Joel Spolsky) о&#160;недостатках &#171;мотивирования рублём&#187;. Еще одна статья о&#160;денежной мотивации. Эта статья во&#160;многом пересекается с&#160;предыдущей, в&#160;ней Асхат Уразбаев раскрывает &#171;подводные камни&#187; бонусного пощрения разработчиков и&#160;дает полезные советы. Технологическое: Flash Builder 4&#160;&#8212; долгожданный релиз нового Flex Builder&#8217;a,&#160;сменившего свое название. Flash Catalyst&#160;&#8212; еще один долгожданный релиз. Этот продукт должен стать промежуточным [...]]]></description>
			<content:encoded><![CDATA[<h3>Менеджерское:</h3>
<ul>
<li><a href="http://www.it4business.ru/lib/1869/">Перевод отличной статьи</a> Джеэля Спольски (Joel Spolsky) о&nbsp;недостатках &laquo;мотивирования рублём&raquo;.</li>
<li>Еще одна <a href="http://agilerussia.ru/files/articles/Urazbaev.MoneyMotivation.pdf">статья о&nbsp;денежной мотивации</a>. Эта статья во&nbsp;многом пересекается с&nbsp;предыдущей, в&nbsp;ней Асхат Уразбаев раскрывает &laquo;подводные камни&raquo; бонусного пощрения разработчиков и&nbsp;дает полезные советы.</li>
</ul>
<h3>Технологическое:</h3>
<ul>
<li><a href="http://labs.adobe.com/technologies/flashbuilder4/">Flash Builder 4</a>&nbsp;&#8212; долгожданный релиз нового Flex Builder&#146;a,&nbsp;сменившего свое название.</li>
<li><a href="http://labs.adobe.com/technologies/flashcatalyst/">Flash Catalyst</a>&nbsp;&#8212; еще один долгожданный релиз. Этот продукт должен стать промежуточным между flash и&nbsp;flex. Основная задача&nbsp;&#8212; простая, визуальная среда для построения <acronym title="rich internet application">RIA</acronym> <acronym title="graphical user interface">GUI</acronym>. Лично для меня его основная ценность в&nbsp;быстром прототипировании, хотя, думаю найдется еще немало применений. </li>
<li>И последняя по порядку, но не по значимости, новость от <a href="http://potapenko.com/">Жени Потапенко</a>, одного из&nbsp;&laquo;отцов&raquo; среди русскоговорящих флеш разработчиков. Женя поделился с&nbsp;нами информацией о&nbsp;том что сейчас занимается разработкой новой IDE для разработки на&nbsp;<acronym title="Action Script 3">AS3</acronym>. <a href="http://potapenko.com/tmp/mps_as.m4v">Скринкаст</a> можно посмотреть уже сейчас. Первый релиз будет к&nbsp;началу августа, так что посмотрим, кто зарелизится раньше <a href="http://potapenko.com/">Женя</a> или <a href="http://adobe.om">Adobe</a>. Известно что IDE будет распространяться бесплатно и&nbsp;доступно для платформ Windows, Linux, Mac.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

