<html><head><title>/</title></head>
<body>
<h2>/</h2>
<ul>
  <li><a href='/nextcloud-server.git/plain/.codecov.yml?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.codecov.yml</a></li>
  <li><a href='/nextcloud-server.git/plain/.devcontainer/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.devcontainer</a></li>
  <li><a href='/nextcloud-server.git/plain/.drone.yml?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.drone.yml</a></li>
  <li><a href='/nextcloud-server.git/plain/.editorconfig?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.editorconfig</a></li>
  <li><a href='/nextcloud-server.git/plain/.eslintignore?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.eslintignore</a></li>
  <li><a href='/nextcloud-server.git/plain/.eslintrc.js?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.eslintrc.js</a></li>
  <li><a href='/nextcloud-server.git/plain/.gitattributes?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.gitattributes</a></li>
  <li><a href='/nextcloud-server.git/plain/.github/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.github</a></li>
  <li><a href='/nextcloud-server.git/plain/.gitignore?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.gitignore</a></li>
  <li><a href='/nextcloud-server.git/plain/.gitmodules?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.gitmodules</a></li>
  <li><a href='/nextcloud-server.git/plain/.htaccess?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.htaccess</a></li>
  <li><a href='/nextcloud-server.git/plain/.idea/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.idea</a></li>
  <li><a href='/nextcloud-server.git/plain/.jshintrc?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.jshintrc</a></li>
  <li><a href='/nextcloud-server.git/plain/.mailmap?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.mailmap</a></li>
  <li><a href='/nextcloud-server.git/plain/.npmignore?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.npmignore</a></li>
  <li><a href='/nextcloud-server.git/plain/.php-cs-fixer.dist.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.php-cs-fixer.dist.php</a></li>
  <li><a href='/nextcloud-server.git/plain/.scrutinizer.yml?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.scrutinizer.yml</a></li>
  <li><a href='/nextcloud-server.git/plain/.tag?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.tag</a></li>
  <li><a href='/nextcloud-server.git/plain/.tx/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.tx</a></li>
  <li><a href='/nextcloud-server.git/plain/.user.ini?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>.user.ini</a></li>
  <li><span>3rdparty</span> @ 4921806</li>
  <li><a href='/nextcloud-server.git/plain/AUTHORS?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>AUTHORS</a></li>
  <li><a href='/nextcloud-server.git/plain/CHANGELOG.md?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>CHANGELOG.md</a></li>
  <li><a href='/nextcloud-server.git/plain/CODE_OF_CONDUCT.md?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>CODE_OF_CONDUCT.md</a></li>
  <li><a href='/nextcloud-server.git/plain/COPYING?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>COPYING</a></li>
  <li><a href='/nextcloud-server.git/plain/COPYING-README?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>COPYING-README</a></li>
  <li><a href='/nextcloud-server.git/plain/Makefile?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>Makefile</a></li>
  <li><a href='/nextcloud-server.git/plain/README.md?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>README.md</a></li>
  <li><a href='/nextcloud-server.git/plain/SECURITY.md?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>SECURITY.md</a></li>
  <li><a href='/nextcloud-server.git/plain/apps/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>apps</a></li>
  <li><a href='/nextcloud-server.git/plain/autotest-checkers.sh?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>autotest-checkers.sh</a></li>
  <li><a href='/nextcloud-server.git/plain/autotest-external.sh?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>autotest-external.sh</a></li>
  <li><a href='/nextcloud-server.git/plain/autotest-js.sh?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>autotest-js.sh</a></li>
  <li><a href='/nextcloud-server.git/plain/autotest.sh?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>autotest.sh</a></li>
  <li><a href='/nextcloud-server.git/plain/babel.config.js?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>babel.config.js</a></li>
  <li><a href='/nextcloud-server.git/plain/build/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>build</a></li>
  <li><a href='/nextcloud-server.git/plain/composer.json?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>composer.json</a></li>
  <li><a href='/nextcloud-server.git/plain/composer.lock?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>composer.lock</a></li>
  <li><a href='/nextcloud-server.git/plain/config/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>config</a></li>
  <li><a href='/nextcloud-server.git/plain/console.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>console.php</a></li>
  <li><a href='/nextcloud-server.git/plain/contribute/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>contribute</a></li>
  <li><a href='/nextcloud-server.git/plain/core/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>core</a></li>
  <li><a href='/nextcloud-server.git/plain/cron.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>cron.php</a></li>
  <li><a href='/nextcloud-server.git/plain/dist/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>dist</a></li>
  <li><a href='/nextcloud-server.git/plain/index.html?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>index.html</a></li>
  <li><a href='/nextcloud-server.git/plain/index.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>index.php</a></li>
  <li><a href='/nextcloud-server.git/plain/lib/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>lib</a></li>
  <li><a href='/nextcloud-server.git/plain/occ?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>occ</a></li>
  <li><a href='/nextcloud-server.git/plain/ocm-provider/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>ocm-provider</a></li>
  <li><a href='/nextcloud-server.git/plain/ocs-provider/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>ocs-provider</a></li>
  <li><a href='/nextcloud-server.git/plain/ocs/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>ocs</a></li>
  <li><a href='/nextcloud-server.git/plain/package-lock.json?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>package-lock.json</a></li>
  <li><a href='/nextcloud-server.git/plain/package.json?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>package.json</a></li>
  <li><a href='/nextcloud-server.git/plain/psalm-ocp.xml?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>psalm-ocp.xml</a></li>
  <li><a href='/nextcloud-server.git/plain/psalm.xml?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>psalm.xml</a></li>
  <li><a href='/nextcloud-server.git/plain/public.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>public.php</a></li>
  <li><a href='/nextcloud-server.git/plain/remote.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>remote.php</a></li>
  <li><a href='/nextcloud-server.git/plain/resources/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>resources</a></li>
  <li><a href='/nextcloud-server.git/plain/robots.txt?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>robots.txt</a></li>
  <li><a href='/nextcloud-server.git/plain/status.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>status.php</a></li>
  <li><a href='/nextcloud-server.git/plain/tests/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>tests</a></li>
  <li><a href='/nextcloud-server.git/plain/themes/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>themes</a></li>
  <li><a href='/nextcloud-server.git/plain/vendor-bin/?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>vendor-bin</a></li>
  <li><a href='/nextcloud-server.git/plain/version.php?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>version.php</a></li>
  <li><a href='/nextcloud-server.git/plain/webpack.common.js?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>webpack.common.js</a></li>
  <li><a href='/nextcloud-server.git/plain/webpack.dev.js?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>webpack.dev.js</a></li>
  <li><a href='/nextcloud-server.git/plain/webpack.modules.js?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>webpack.modules.js</a></li>
  <li><a href='/nextcloud-server.git/plain/webpack.prod.js?h=log-event-recursion&amp;id=2e55ce089954bdab483cb1564a4b00b79b705346'>webpack.prod.js</a></li>
 </ul>
</body></html>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="c1"># frozen_string_literal: true</span>

<span class="c1"># Redmine - project management software</span>
<span class="c1"># Copyright (C) 2006-2023  Jean-Philippe Lang</span>
<span class="c1">#</span>
<span class="c1"># This program is free software; you can redistribute it and/or</span>
<span class="c1"># modify it under the terms of the GNU General Public License</span>
<span class="c1"># as published by the Free Software Foundation; either version 2</span>
<span class="c1"># of the License, or (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># This program is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with this program; if not, write to the Free Software</span>
<span class="c1"># Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span>

<span class="nb">require</span><span class="w"> </span><span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s1">&#39;../../../../../test_helper&#39;</span><span class="p">,</span><span class="w"> </span><span class="bp">__FILE__</span><span class="p">)</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">GanttHelperTest</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">Redmine</span><span class="o">::</span><span class="no">HelperTest</span>
<span class="w">  </span><span class="n">fixtures</span><span class="w"> </span><span class="ss">:projects</span><span class="p">,</span><span class="w"> </span><span class="ss">:trackers</span><span class="p">,</span><span class="w"> </span><span class="ss">:projects_trackers</span><span class="p">,</span><span class="w"> </span><span class="ss">:issue_statuses</span><span class="p">,</span>
<span class="w">           </span><span class="ss">:enumerations</span><span class="p">,</span><span class="w"> </span><span class="ss">:users</span><span class="p">,</span><span class="w"> </span><span class="ss">:issue_categories</span>

<span class="w">  </span><span class="kp">include</span><span class="w"> </span><span class="no">ProjectsHelper</span>
<span class="w">  </span><span class="kp">include</span><span class="w"> </span><span class="no">IssuesHelper</span>
<span class="w">  </span><span class="kp">include</span><span class="w"> </span><span class="no">QueriesHelper</span>
<span class="w">  </span><span class="kp">include</span><span class="w"> </span><span class="no">AvatarsHelper</span>

<span class="w">  </span><span class="kp">include</span><span class="w"> </span><span class="no">ERB</span><span class="o">::</span><span class="no">Util</span>
<span class="w">  </span><span class="kp">include</span><span class="w"> </span><span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">url_helpers</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">setup</span>
<span class="w">    </span><span class="n">setup_with_controller</span>
<span class="w">    </span><span class="no">User</span><span class="o">.</span><span class="n">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">User</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">today</span>
<span class="w">    </span><span class="vi">@today</span><span class="w"> </span><span class="o">||=</span><span class="w"> </span><span class="no">Date</span><span class="o">.</span><span class="n">today</span>
<span class="w">  </span><span class="k">end</span>
<span class="w">  </span><span class="kp">private</span><span class="w"> </span><span class="ss">:today</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">gantt_start</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">date_from</span>
<span class="w">  </span><span class="k">end</span>
<span class="w">  </span><span class="kp">private</span><span class="w"> </span><span class="ss">:gantt_start</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">gantt_end</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">date_to</span>
<span class="w">  </span><span class="k">end</span>
<span class="w">  </span><span class="kp">private</span><span class="w"> </span><span class="ss">:gantt_end</span>

<span class="w">  </span><span class="c1"># Creates a Gantt chart for a 4 week span</span>
<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">create_gantt</span><span class="p">(</span><span class="n">project</span><span class="o">=</span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span><span class="p">,</span><span class="w"> </span><span class="n">options</span><span class="o">=</span><span class="p">{})</span>
<span class="w">    </span><span class="vi">@project</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">project</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">Gantt</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">project</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@project</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">query</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">IssueQuery</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;Gantt&#39;</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">view</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">self</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">instance_variable_set</span><span class="p">(</span><span class="s1">&#39;@date_from&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">options</span><span class="o">[</span><span class="ss">:date_from</span><span class="o">]</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">14</span><span class="p">))</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">instance_variable_set</span><span class="p">(</span><span class="s1">&#39;@date_to&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">options</span><span class="o">[</span><span class="ss">:date_to</span><span class="o">]</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">14</span><span class="p">))</span>
<span class="w">  </span><span class="k">end</span>
<span class="w">  </span><span class="kp">private</span><span class="w"> </span><span class="ss">:create_gantt</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#number_of_rows with one project should return the number of rows just for that project&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">p1</span><span class="p">,</span><span class="w"> </span><span class="n">p2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span><span class="p">,</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="n">i1</span><span class="p">,</span><span class="w"> </span><span class="n">i2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">p1</span><span class="p">),</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">p2</span><span class="p">)</span>
<span class="w">    </span><span class="n">create_gantt</span><span class="p">(</span><span class="n">p1</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">number_of_rows</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#number_of_rows with no project should return the total number of rows for all the projects, recursively&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">p1</span><span class="p">,</span><span class="w"> </span><span class="n">p2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span><span class="p">,</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="n">create_gantt</span><span class="p">(</span><span class="kp">nil</span><span class="p">)</span>
<span class="w">    </span><span class="c1"># fix the return value of #number_of_rows_on_project() to an arbitrary value</span>
<span class="w">    </span><span class="c1"># so that we really only test #number_of_rows</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:number_of_rows_on_project</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
<span class="w">    </span><span class="c1"># also fix #projects because we want to test #number_of_rows in isolation</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:projects</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="no">Project</span><span class="o">.</span><span class="n">all</span><span class="p">)</span>
<span class="w">    </span><span class="c1"># actual test</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">count</span><span class="o">*</span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">number_of_rows</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#number_of_rows should not exceed max_rows option&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="nb">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="mi">5</span><span class="o">.</span><span class="n">times</span><span class="w"> </span><span class="k">do</span>
<span class="w">      </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="nb">p</span><span class="p">)</span>
<span class="w">    </span><span class="k">end</span>
<span class="w">    </span><span class="n">create_gantt</span><span class="p">(</span><span class="nb">p</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">render</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">number_of_rows</span>
<span class="w">    </span><span class="n">assert</span><span class="w"> </span><span class="o">!</span><span class="vi">@gantt</span><span class="o">.</span><span class="n">truncated</span>
<span class="w">    </span><span class="n">create_gantt</span><span class="p">(</span><span class="nb">p</span><span class="p">,</span><span class="w"> </span><span class="ss">:max_rows</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">render</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">number_of_rows</span>
<span class="w">    </span><span class="n">assert</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">truncated</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#number_of_rows_on_project should count 0 for an empty the project&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">number_of_rows_on_project</span><span class="p">(</span><span class="vi">@project</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#number_of_rows_on_project should count the number of issues without a version&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">issues</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:fixed_version</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="kp">nil</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">number_of_rows_on_project</span><span class="p">(</span><span class="vi">@project</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#number_of_rows_on_project should count the number of issues on versions, including cross-project&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">version</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">issues</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:fixed_version</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">version</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">number_of_rows_on_project</span><span class="p">(</span><span class="vi">@project</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">setup_subjects</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">enabled_module_names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="ss">:issue_tracking</span><span class="o">]</span>
<span class="w">    </span><span class="vi">@tracker</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Tracker</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">trackers</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@tracker</span>
<span class="w">    </span><span class="vi">@version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">),</span><span class="w"> </span><span class="ss">:sharing</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;none&#39;</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@version</span>
<span class="w">    </span><span class="vi">@issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:fixed_version</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@version</span><span class="p">,</span>
<span class="w">                               </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;gantt#line_for_project&quot;</span><span class="p">,</span>
<span class="w">                               </span><span class="ss">:tracker</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@tracker</span><span class="p">,</span>
<span class="w">                               </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span>
<span class="w">                               </span><span class="ss">:done_ratio</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span>
<span class="w">                               </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">),</span>
<span class="w">                               </span><span class="ss">:due_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">))</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">issues</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@issue</span>
<span class="w">  </span><span class="k">end</span>
<span class="w">  </span><span class="kp">private</span><span class="w"> </span><span class="ss">:setup_subjects</span>

<span class="w">  </span><span class="c1"># TODO: more of an integration test</span>
<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subjects project should be rendered&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">setup_subjects</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subjects</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.project-name a&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@project</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr">/</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.project-name[style*=&quot;left:4px&quot;]&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subjects version should be rendered&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">setup_subjects</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subjects</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.version-name a&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@version</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr">/</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.version-name[style*=&quot;left:24px&quot;]&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subjects version without assigned issues should not be rendered&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">setup_subjects</span>
<span class="w">    </span><span class="vi">@version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">14</span><span class="p">),</span>
<span class="w">                                       </span><span class="ss">:sharing</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;none&#39;</span><span class="p">,</span>
<span class="w">                                       </span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;empty_version&#39;</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@version</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subjects</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.version-name a&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/</span><span class="si">#{</span><span class="vi">@version</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr">/</span><span class="p">,</span><span class="w"> </span><span class="ss">:count</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">0</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subjects issue should be rendered&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">setup_subjects</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subjects</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.issue-subject&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@issue</span><span class="o">.</span><span class="n">subject</span><span class="si">}</span><span class="sr">/</span>
<span class="w">    </span><span class="c1"># subject 56px: 44px + 12px(collapse/expand icon&#39;s width)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.issue-subject[style*=&quot;left:56px&quot;]&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subjects issue assigned to a shared version of another project should be rendered&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">setup_subjects</span>
<span class="w">    </span><span class="nb">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="nb">p</span><span class="o">.</span><span class="n">enabled_module_names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="ss">:issue_tracking</span><span class="o">]</span>
<span class="w">    </span><span class="vi">@shared_version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:sharing</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;system&#39;</span><span class="p">)</span>
<span class="w">    </span><span class="nb">p</span><span class="o">.</span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@shared_version</span>
<span class="w">    </span><span class="c1"># Reassign the issue to a shared version of another project</span>
<span class="w">    </span><span class="vi">@issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:fixed_version</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@shared_version</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;gantt#assigned_to_shared_version&quot;</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:tracker</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@tracker</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:done_ratio</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">),</span>
<span class="w">                                   </span><span class="ss">:due_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">))</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">issues</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@issue</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subjects</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.issue-subject&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@issue</span><span class="o">.</span><span class="n">subject</span><span class="si">}</span><span class="sr">/</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subjects issue with subtasks should indent subtasks&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">setup_subjects</span>
<span class="w">    </span><span class="n">attrs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:tracker</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@tracker</span><span class="p">,</span><span class="w"> </span><span class="ss">:fixed_version</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@version</span><span class="p">}</span>
<span class="w">    </span><span class="vi">@child1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span>
<span class="w">                       </span><span class="n">attrs</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child1&#39;</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@issue</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">),</span>
<span class="w">                                   </span><span class="ss">:due_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p">))</span>
<span class="w">                     </span><span class="p">)</span>
<span class="w">    </span><span class="vi">@child2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span>
<span class="w">                       </span><span class="n">attrs</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child2&#39;</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@issue</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">today</span><span class="p">,</span>
<span class="w">                                   </span><span class="ss">:due_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">))</span>
<span class="w">                     </span><span class="p">)</span>
<span class="w">    </span><span class="vi">@grandchild</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span>
<span class="w">                          </span><span class="n">attrs</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;grandchild&#39;</span><span class="p">,</span>
<span class="w">                                      </span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@child1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="w">                                      </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">),</span>
<span class="w">                                      </span><span class="ss">:due_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p">))</span>
<span class="w">                        </span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subjects</span>
<span class="w">    </span><span class="c1"># parent task 44px</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.issue-subject[style*=&quot;left:44px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@issue</span><span class="o">.</span><span class="n">subject</span><span class="si">}</span><span class="sr">/</span>
<span class="w">    </span><span class="c1"># children 64px</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.issue-subject[style*=&quot;left:64px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="sr">/child1/</span>
<span class="w">    </span><span class="c1"># children 76px: 64px + 12px(collapse/expand icon&#39;s width)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.issue-subject[style*=&quot;left:76px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="sr">/child2/</span>
<span class="w">    </span><span class="c1"># grandchild 96px: 84px + 12px(collapse/expand icon&#39;s width)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.issue-subject[style*=&quot;left:96px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="sr">/grandchild/</span><span class="p">,</span><span class="w"> </span><span class="vi">@output_buffer</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#lines&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">enabled_module_names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="ss">:issue_tracking</span><span class="o">]</span>
<span class="w">    </span><span class="vi">@tracker</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Tracker</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">trackers</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@tracker</span>
<span class="w">    </span><span class="vi">@version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">))</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@version</span>
<span class="w">    </span><span class="vi">@issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:fixed_version</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@version</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;gantt#line_for_project&quot;</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:tracker</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@tracker</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:done_ratio</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">),</span>
<span class="w">                             </span><span class="ss">:due_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">))</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">issues</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@issue</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">lines</span>

<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.project.task_todo&quot;</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.project.starting&quot;</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.project.ending&quot;</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.label.project&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@project</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr">/</span>

<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.version.task_todo&quot;</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.version.starting&quot;</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.version.ending&quot;</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.label.version&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@version</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr">/</span>

<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.task_todo&quot;</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.task.label&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@issue</span><span class="o">.</span><span class="n">done_ratio</span><span class="si">}</span><span class="sr">/</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.tooltip&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="vi">@issue</span><span class="o">.</span><span class="n">subject</span><span class="si">}</span><span class="sr">/</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#selected_column_content&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">column_names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="ss">:assigned_to</span><span class="o">]</span>
<span class="w">    </span><span class="n">issue</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="ss">:assigned_to_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue</span><span class="o">.</span><span class="n">assignable_users</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">issues</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">issue</span>
<span class="w">    </span><span class="c1"># :column =&gt; assigned_to</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">selected_column_content</span><span class="p">({</span><span class="ss">:column</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">columns</span><span class="o">.</span><span class="n">last</span><span class="p">})</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.issue_assigned_to#assigned_to_issue_</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject_for_project&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject_for_project</span><span class="p">(</span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;a[href=?]&#39;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/projects/</span><span class="si">#{</span><span class="vi">@project</span><span class="o">.</span><span class="n">identifier</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/</span><span class="si">#{</span><span class="vi">@project</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr">/</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject_for_project should style overdue projects&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:overdue?</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject_for_project</span><span class="p">(</span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div span.project-overdue&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject_for_version&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">today</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject_for_version</span><span class="p">(</span><span class="n">version</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;a[href=?]&#39;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/versions/</span><span class="si">#{</span><span class="n">version</span><span class="o">.</span><span class="n">to_param</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/Foo/</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject_for_version should style overdue versions&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">today</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">)</span>
<span class="w">    </span><span class="n">version</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:overdue?</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject_for_version</span><span class="p">(</span><span class="n">version</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div span.version-overdue&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject_for_version should style behind schedule versions&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">today</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">)</span>
<span class="w">    </span><span class="n">version</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:behind_schedule?</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject_for_version</span><span class="p">(</span><span class="n">version</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div span.version-behind-schedule&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject_for_issue&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject_for_issue</span><span class="p">(</span><span class="n">issue</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">subject</span><span class="si">}</span><span class="sr">/</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;a[href=?]&#39;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/issues/</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">to_param</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">tracker</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr"> #</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="sr">/</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject_for_issue should style overdue issues&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">)</span>
<span class="w">    </span><span class="n">issue</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:overdue?</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject_for_issue</span><span class="p">(</span><span class="n">issue</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div span.issue-overdue&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject should add an absolute positioned div&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject</span><span class="p">(</span><span class="s1">&#39;subject&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div[style*=absolute]&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;subject&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#subject should use the indent option to move the div to the right&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">subject</span><span class="p">(</span><span class="s1">&#39;subject&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:indent</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">40</span><span class="p">)</span>
<span class="w">    </span><span class="c1"># subject 52px: 40px(indent) + 12px(collapse/expand icon&#39;s width)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div[style*=&quot;left:52px&quot;]&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line_for_project&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:start_date</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:due_date</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line_for_project</span><span class="p">(</span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.project.label&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="o">.</span><span class="n">name</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line_for_version&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">)</span>
<span class="w">    </span><span class="n">version</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:start_date</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span>
<span class="w">    </span><span class="n">version</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:due_date</span><span class="p">)</span><span class="o">.</span><span class="n">returns</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span>
<span class="w">    </span><span class="n">version</span><span class="o">.</span><span class="n">stubs</span><span class="p">(</span><span class="ss">:visible_fixed_issues</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">stub</span><span class="p">(</span><span class="ss">:completed_percent</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">30</span><span class="p">))</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line_for_version</span><span class="p">(</span><span class="n">version</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.version.label&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/Foo/</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.version.label&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/30%/</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line_for_issue&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="n">issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="ss">:due_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="ss">:done_ratio</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">30</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line_for_issue</span><span class="p">(</span><span class="n">issue</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.task.label&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="sr">/</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.task.label&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span> <span class="sr">/30%/</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.tooltip&quot;</span><span class="p">,</span><span class="w"> </span><span class="sr">/</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">subject</span><span class="si">}</span><span class="sr">/</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line todo line should start from the starting point on the left&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;left:28px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line todo line should appear if it ends on the leftmost date in the gantt&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="o">[</span><span class="n">gantt_start</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">gantt_start</span><span class="o">].</span><span class="n">each</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">start_date</span><span class="o">|</span>
<span class="w">      </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span><span class="w"> </span><span class="n">gantt_start</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">      </span><span class="c1"># the leftmost date (Date.today - 14 days)</span>
<span class="w">      </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;left:0px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="vi">@output_buffer</span>
<span class="w">      </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;width:2px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="vi">@output_buffer</span>
<span class="w">    </span><span class="k">end</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line todo line should appear if it starts on the rightmost date in the gantt&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="o">[</span><span class="n">gantt_end</span><span class="p">,</span><span class="w"> </span><span class="n">gantt_end</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="o">].</span><span class="n">each</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">end_date</span><span class="o">|</span>
<span class="w">      </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">gantt_end</span><span class="p">,</span><span class="w"> </span><span class="n">end_date</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">      </span><span class="c1"># the rightmost date (Date.today + 14 days)</span>
<span class="w">      </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;left:112px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="vi">@output_buffer</span>
<span class="w">      </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;width:2px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="vi">@output_buffer</span>
<span class="w">    </span><span class="k">end</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line todo line should be the total width&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;width:58px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line late line should start from the starting point on the left&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_late[style*=&quot;left:28px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line late line should be the total delayed width&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_late[style*=&quot;width:30px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line late line should be the same width as task_todo if start date and end date are the same day&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_late[style*=&quot;width:2px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;width:2px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line late line should be the same width as task_todo if start date and today are the same day&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_late[style*=&quot;width:2px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_todo[style*=&quot;width:2px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line done line should start from the starting point on the left&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_done[style*=&quot;left:28px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line done line should be the width for the done ratio&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="c1"># 15 days * 4 px * 30% - 2 px for borders = 16 px</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_done[style*=&quot;width:16px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line done line should be the total width for 100% done ratio&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="c1"># 15 days * 4 px - 2 px for borders = 58 px</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_done[style*=&quot;width:58px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line done line should be the total width for 100% done ratio with same start and end dates&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_done[style*=&quot;width:2px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line done line should not be the total done width if the gantt starts after start date&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_done[style*=&quot;left:0px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.task_done[style*=&quot;width:8px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line starting marker should appear at the start date&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.starting&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.starting[style*=&quot;left:28px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">    </span><span class="c1"># starting marker on the leftmost boundary of the gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">gantt_start</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.starting[style*=&quot;left:0px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line starting marker should not appear if the start date is before gantt start date&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">gantt_start</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.starting&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line ending marker should appear at the end date&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">today</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.ending&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.ending[style*=&quot;left:88px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">    </span><span class="c1"># ending marker on the rightmost boundary of the gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="n">gantt_end</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">,</span><span class="w"> </span><span class="ss">:zoom</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s1">&#39;div.ending[style*=&quot;left:116px&quot;]&#39;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line ending marker should not appear if the end date is before gantt start date&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">gantt_start</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="n">gantt_start</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">21</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.ending&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#line label should appear at the far left, even if it&#39;s before gantt start date&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">gantt_start</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="n">gantt_start</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">21</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;line&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.label&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:text</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;line&#39;</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="nb">test</span><span class="w"> </span><span class="s2">&quot;#column_content_for_issue&quot;</span><span class="w"> </span><span class="k">do</span>
<span class="w">    </span><span class="n">create_gantt</span>
<span class="w">    </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">column_names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="ss">:assigned_to</span><span class="o">]</span>
<span class="w">    </span><span class="n">issue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="n">issue</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="ss">:assigned_to_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue</span><span class="o">.</span><span class="n">assignable_users</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">issues</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">issue</span>
<span class="w">    </span><span class="c1"># :column =&gt; assigned_to</span>
<span class="w">    </span><span class="n">options</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="ss">:column</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">columns</span><span class="o">.</span><span class="n">last</span><span class="p">,</span><span class="w"> </span><span class="ss">:top</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="mi">64</span><span class="p">,</span><span class="w"> </span><span class="ss">:format</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="ss">:html</span><span class="p">}</span>
<span class="w">    </span><span class="vi">@output_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@gantt</span><span class="o">.</span><span class="n">column_content_for_issue</span><span class="p">(</span><span class="n">issue</span><span class="p">,</span><span class="w"> </span><span class="n">options</span><span class="p">)</span>

<span class="w">    </span><span class="n">assert_select</span><span class="w"> </span><span class="s2">&quot;div.issue_assigned_to#assigned_to_issue_</span><span class="si">#{</span><span class="n">issue</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="w">    </span><span class="n">assert_includes</span><span class="w"> </span><span class="vi">@output_buffer</span><span class="p">,</span><span class="w"> </span><span class="n">column_content</span><span class="p">(</span><span class="n">options</span><span class="o">[</span><span class="ss">:column</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">issue</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">test_sort_issues_no_date</span>
<span class="w">    </span><span class="n">project</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="n">issue1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">issue2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert</span><span class="w"> </span><span class="n">issue1</span><span class="o">.</span><span class="n">root_id</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">issue2</span><span class="o">.</span><span class="n">root_id</span>
<span class="w">    </span><span class="n">child1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child&#39;</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">child2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child&#39;</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">child3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">child1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child&#39;</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="n">child1</span><span class="o">.</span><span class="n">root_id</span><span class="p">,</span><span class="w"> </span><span class="n">child2</span><span class="o">.</span><span class="n">root_id</span>
<span class="w">    </span><span class="n">assert</span><span class="w"> </span><span class="n">child1</span><span class="o">.</span><span class="n">lft</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">child2</span><span class="o">.</span><span class="n">lft</span>
<span class="w">    </span><span class="n">assert</span><span class="w"> </span><span class="n">child3</span><span class="o">.</span><span class="n">lft</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">child2</span><span class="o">.</span><span class="n">lft</span>
<span class="w">    </span><span class="n">issues</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="n">child3</span><span class="p">,</span><span class="w"> </span><span class="n">child2</span><span class="p">,</span><span class="w"> </span><span class="n">child1</span><span class="p">,</span><span class="w"> </span><span class="n">issue2</span><span class="p">,</span><span class="w"> </span><span class="n">issue1</span><span class="o">]</span>
<span class="w">    </span><span class="no">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">Gantt</span><span class="o">.</span><span class="n">sort_issues!</span><span class="p">(</span><span class="n">issues</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="o">[</span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">child1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">child3</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">child2</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue2</span><span class="o">.</span><span class="n">id</span><span class="o">]</span><span class="p">,</span>
<span class="w">                 </span><span class="n">issues</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">v</span><span class="o">|</span><span class="w"> </span><span class="n">v</span><span class="o">.</span><span class="n">id</span><span class="p">}</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">test_sort_issues_root_only</span>
<span class="w">    </span><span class="n">project</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="n">issue1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">issue2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">issue3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span>
<span class="w">    </span><span class="n">issue4</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">2</span><span class="p">))</span>
<span class="w">    </span><span class="n">issues</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="n">issue4</span><span class="p">,</span><span class="w"> </span><span class="n">issue3</span><span class="p">,</span><span class="w"> </span><span class="n">issue2</span><span class="p">,</span><span class="w"> </span><span class="n">issue1</span><span class="o">]</span>
<span class="w">    </span><span class="no">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">Gantt</span><span class="o">.</span><span class="n">sort_issues!</span><span class="p">(</span><span class="n">issues</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="o">[</span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue2</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue4</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue3</span><span class="o">.</span><span class="n">id</span><span class="o">]</span><span class="p">,</span>
<span class="w">                 </span><span class="n">issues</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">v</span><span class="o">|</span><span class="w"> </span><span class="n">v</span><span class="o">.</span><span class="n">id</span><span class="p">}</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">test_sort_issues_tree</span>
<span class="w">    </span><span class="n">project</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="n">issue1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">issue2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s2">&quot;test&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span>
<span class="w">                             </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">2</span><span class="p">))</span>
<span class="w">    </span><span class="n">issue1_child1</span><span class="w"> </span><span class="o">=</span>
<span class="w">      </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child&#39;</span><span class="p">,</span>
<span class="w">                      </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">)</span>
<span class="w">    </span><span class="n">issue1_child2</span><span class="w"> </span><span class="o">=</span>
<span class="w">      </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child&#39;</span><span class="p">,</span>
<span class="w">                      </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span><span class="w"> </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">10</span><span class="p">))</span>
<span class="w">    </span><span class="n">issue1_child1_child1</span><span class="w"> </span><span class="o">=</span>
<span class="w">      </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue1_child1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child&#39;</span><span class="p">,</span>
<span class="w">                      </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span><span class="w"> </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">8</span><span class="p">))</span>
<span class="w">    </span><span class="n">issue1_child1_child2</span><span class="w"> </span><span class="o">=</span>
<span class="w">      </span><span class="no">Issue</span><span class="o">.</span><span class="n">generate!</span><span class="p">(</span><span class="ss">:parent_issue_id</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">issue1_child1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">:subject</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;child&#39;</span><span class="p">,</span>
<span class="w">                      </span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span><span class="w"> </span><span class="ss">:start_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">9</span><span class="p">))</span>
<span class="w">    </span><span class="n">issue1_child1_child1_logic</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">Gantt</span><span class="o">.</span><span class="n">sort_issue_logic</span><span class="p">(</span><span class="n">issue1_child1_child1</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="o">[[</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="o">[</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">9</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child1</span><span class="o">.</span><span class="n">id</span><span class="o">]</span><span class="p">,</span>
<span class="w">                  </span><span class="o">[</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child1_child1</span><span class="o">.</span><span class="n">id</span><span class="o">]]</span><span class="p">,</span>
<span class="w">                 </span><span class="n">issue1_child1_child1_logic</span>
<span class="w">    </span><span class="n">issue1_child1_child2_logic</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">Gantt</span><span class="o">.</span><span class="n">sort_issue_logic</span><span class="p">(</span><span class="n">issue1_child1_child2</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="o">[[</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="o">[</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">9</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child1</span><span class="o">.</span><span class="n">id</span><span class="o">]</span><span class="p">,</span>
<span class="w">                  </span><span class="o">[</span><span class="n">today</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">9</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child1_child2</span><span class="o">.</span><span class="n">id</span><span class="o">]]</span><span class="p">,</span>
<span class="w">                 </span><span class="n">issue1_child1_child2_logic</span>
<span class="w">    </span><span class="n">issues</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="n">issue1_child1_child2</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child1_child1</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child2</span><span class="p">,</span>
<span class="w">              </span><span class="n">issue1_child1</span><span class="p">,</span><span class="w"> </span><span class="n">issue2</span><span class="p">,</span><span class="w"> </span><span class="n">issue1</span><span class="o">]</span>
<span class="w">    </span><span class="no">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">Gantt</span><span class="o">.</span><span class="n">sort_issues!</span><span class="p">(</span><span class="n">issues</span><span class="p">)</span>
<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="o">[</span><span class="n">issue1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child2</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="w">                  </span><span class="n">issue1_child1_child2</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue1_child1_child1</span><span class="o">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">issue2</span><span class="o">.</span><span class="n">id</span><span class="o">]</span><span class="p">,</span>
<span class="w">                 </span><span class="n">issues</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">v</span><span class="o">|</span><span class="w"> </span><span class="n">v</span><span class="o">.</span><span class="n">id</span><span class="p">}</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">test_sort_versions</span>
<span class="w">    </span><span class="n">project</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Project</span><span class="o">.</span><span class="n">generate!</span>
<span class="w">    </span><span class="n">versions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[]</span>
<span class="w">    </span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">create!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span><span class="w"> </span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;test1&#39;</span><span class="p">)</span>
<span class="w">    </span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">create!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span><span class="w"> </span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;test2&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;2013-10-25&#39;</span><span class="p">)</span>
<span class="w">    </span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">create!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span><span class="w"> </span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;test3&#39;</span><span class="p">)</span>
<span class="w">    </span><span class="n">versions</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="no">Version</span><span class="o">.</span><span class="n">create!</span><span class="p">(</span><span class="ss">:project</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">project</span><span class="p">,</span><span class="w"> </span><span class="ss">:name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;test4&#39;</span><span class="p">,</span><span class="w"> </span><span class="ss">:effective_date</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;2013-10-02&#39;</span><span class="p">)</span>

<span class="w">    </span><span class="n">assert_equal</span><span class="w"> </span><span class="n">versions</span><span class="o">.</span><span class="n">sort</span><span class="p">,</span><span class="w"> </span><span class="no">Redmine</span><span class="o">::</span><span class="no">Helpers</span><span class="o">::</span><span class="no">Gantt</span><span class="o">.</span><span class="n">sort_versions!</span><span class="p">(</span><span class="n">versions</span><span class="o">.</span><span class="n">dup</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2025-07-31 17:02:36 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
