taskjuggler 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (415) hide show
  1. data/CHANGELOG +119 -0
  2. data/benchmarks/allocatedSlots.tjp +1602 -0
  3. data/benchmarks/booking.tjp +40 -30
  4. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/css/tjmanual.css +0 -0
  5. data/{test/TestSuite/Scheduler/Correct → benchmarks}/css/tjreport.css +1 -0
  6. data/benchmarks/gantt.tjp +57 -0
  7. data/benchmarks/htmltaskreport.tjp +26 -1
  8. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/details.png +0 -0
  9. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-green.png +0 -0
  10. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-red.png +0 -0
  11. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-yellow.png +0 -0
  12. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/resource.png +0 -0
  13. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/resourcegroup.png +0 -0
  14. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/task.png +0 -0
  15. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/taskgroup.png +0 -0
  16. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-down.png +0 -0
  17. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-flat.png +0 -0
  18. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-up.png +0 -0
  19. data/benchmarks/profile.clt +36082 -0
  20. data/benchmarks/profile.html +58182 -0
  21. data/benchmarks/runbench.rb +6 -0
  22. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/scripts/wz_tooltip.js +0 -0
  23. data/doc/AppConfig.html +85 -37
  24. data/doc/Arguments.html +11 -1
  25. data/doc/CHANGELOG.html +131 -2
  26. data/doc/COPYING.html +11 -1
  27. data/doc/Object.html +12 -3
  28. data/doc/README.html +11 -1
  29. data/doc/RuntimeConfig.html +11 -1
  30. data/doc/String.html +11 -1
  31. data/doc/StringIO.html +11 -1
  32. data/doc/TaskJuggler.html +250 -219
  33. data/doc/TaskJuggler/Account.html +11 -1
  34. data/doc/TaskJuggler/AccountAttribute.html +11 -1
  35. data/doc/TaskJuggler/AccountScenario.html +11 -1
  36. data/doc/TaskJuggler/Allocation.html +11 -1
  37. data/doc/TaskJuggler/AllocationAttribute.html +11 -1
  38. data/doc/TaskJuggler/AttributeBase.html +11 -1
  39. data/doc/TaskJuggler/AttributeDefinition.html +11 -1
  40. data/doc/TaskJuggler/BatchProcessor.html +11 -1
  41. data/doc/TaskJuggler/Booking.html +11 -1
  42. data/doc/TaskJuggler/BookingListAttribute.html +11 -1
  43. data/doc/TaskJuggler/BooleanAttribute.html +11 -1
  44. data/doc/TaskJuggler/CSVFile.html +12 -2
  45. data/doc/TaskJuggler/CellSettingPattern.html +11 -1
  46. data/doc/TaskJuggler/CellSettingPatternList.html +11 -1
  47. data/doc/TaskJuggler/Charge.html +11 -1
  48. data/doc/TaskJuggler/ChargeListAttribute.html +11 -1
  49. data/doc/TaskJuggler/ChargeSet.html +11 -1
  50. data/doc/TaskJuggler/ChargeSetListAttribute.html +11 -1
  51. data/doc/TaskJuggler/CollisionDetector.html +1063 -0
  52. data/doc/TaskJuggler/ColumnListAttribute.html +11 -1
  53. data/doc/TaskJuggler/ColumnTable.html +11 -1
  54. data/doc/TaskJuggler/Daemon.html +11 -1
  55. data/doc/TaskJuggler/{OnShiftCache.html → DataCache.html} +127 -139
  56. data/doc/TaskJuggler/DataCacheEntry.html +711 -0
  57. data/doc/TaskJuggler/DateAttribute.html +11 -1
  58. data/doc/TaskJuggler/DefinitionListAttribute.html +11 -1
  59. data/doc/TaskJuggler/DependencyListAttribute.html +11 -1
  60. data/doc/TaskJuggler/DurationAttribute.html +16 -5
  61. data/doc/TaskJuggler/FileList.html +11 -1
  62. data/doc/TaskJuggler/FileRecord.html +11 -1
  63. data/doc/TaskJuggler/FixnumAttribute.html +19 -9
  64. data/doc/TaskJuggler/FlagListAttribute.html +29 -19
  65. data/doc/TaskJuggler/FloatAttribute.html +23 -13
  66. data/doc/TaskJuggler/FormatListAttribute.html +19 -9
  67. data/doc/TaskJuggler/GanttChart.html +94 -133
  68. data/doc/TaskJuggler/GanttContainer.html +11 -1
  69. data/doc/TaskJuggler/GanttHeader.html +11 -1
  70. data/doc/TaskJuggler/GanttHeaderScaleItem.html +11 -1
  71. data/doc/TaskJuggler/GanttLine.html +11 -1
  72. data/doc/TaskJuggler/GanttLoadStack.html +11 -1
  73. data/doc/TaskJuggler/GanttMilestone.html +11 -1
  74. data/doc/TaskJuggler/GanttRouter.html +247 -596
  75. data/doc/TaskJuggler/GanttTaskBar.html +11 -1
  76. data/doc/TaskJuggler/HTMLDocument.html +11 -1
  77. data/doc/TaskJuggler/HTMLGraphics.html +11 -1
  78. data/doc/TaskJuggler/Interval.html +11 -1
  79. data/doc/TaskJuggler/IntervalListAttribute.html +33 -23
  80. data/doc/TaskJuggler/JobInfo.html +11 -1
  81. data/doc/TaskJuggler/Journal.html +11 -1
  82. data/doc/TaskJuggler/JournalEntry.html +11 -1
  83. data/doc/TaskJuggler/JournalEntryList.html +11 -1
  84. data/doc/TaskJuggler/KeywordArray.html +11 -1
  85. data/doc/TaskJuggler/KeywordDocumentation.html +16 -6
  86. data/doc/TaskJuggler/Limits.html +11 -1
  87. data/doc/TaskJuggler/Limits/Limit.html +11 -1
  88. data/doc/TaskJuggler/LimitsAttribute.html +24 -14
  89. data/doc/TaskJuggler/ListAttributeBase.html +11 -1
  90. data/doc/TaskJuggler/Log.html +11 -1
  91. data/doc/TaskJuggler/LogFile.html +11 -1
  92. data/doc/TaskJuggler/LogicalAttribute.html +11 -1
  93. data/doc/TaskJuggler/LogicalExpression.html +11 -1
  94. data/doc/TaskJuggler/LogicalExpressionAttribute.html +19 -9
  95. data/doc/TaskJuggler/LogicalFlag.html +11 -1
  96. data/doc/TaskJuggler/LogicalFunction.html +11 -1
  97. data/doc/TaskJuggler/LogicalOperation.html +11 -1
  98. data/doc/TaskJuggler/Macro.html +11 -1
  99. data/doc/TaskJuggler/MacroTable.html +11 -1
  100. data/doc/TaskJuggler/ManagerResponsibilities.html +11 -1
  101. data/doc/TaskJuggler/ManagerStatusRecord.html +11 -1
  102. data/doc/TaskJuggler/Message.html +11 -1
  103. data/doc/TaskJuggler/MessageHandler.html +11 -1
  104. data/doc/TaskJuggler/Navigator.html +12 -2
  105. data/doc/TaskJuggler/NavigatorElement.html +11 -1
  106. data/doc/TaskJuggler/NikuProject.html +11 -1
  107. data/doc/TaskJuggler/NikuReport.html +11 -1
  108. data/doc/TaskJuggler/NikuResource.html +11 -1
  109. data/doc/TaskJuggler/NodeListAttribute.html +17 -7
  110. data/doc/TaskJuggler/PlaceHolderCell.html +722 -0
  111. data/doc/TaskJuggler/ProcessIntercom.html +11 -1
  112. data/doc/TaskJuggler/ProcessIntercomIface.html +11 -1
  113. data/doc/TaskJuggler/Project.html +587 -500
  114. data/doc/TaskJuggler/ProjectBroker.html +11 -1
  115. data/doc/TaskJuggler/ProjectBrokerIface.html +11 -1
  116. data/doc/TaskJuggler/ProjectFileParser.html +205 -192
  117. data/doc/TaskJuggler/ProjectFileScanner.html +230 -207
  118. data/doc/TaskJuggler/ProjectRecord.html +11 -1
  119. data/doc/TaskJuggler/ProjectServer.html +11 -1
  120. data/doc/TaskJuggler/ProjectServerIface.html +11 -1
  121. data/doc/TaskJuggler/PropertyAttribute.html +19 -9
  122. data/doc/TaskJuggler/PropertyList.html +95 -83
  123. data/doc/TaskJuggler/PropertySet.html +11 -1
  124. data/doc/TaskJuggler/PropertyTreeNode.html +11 -1
  125. data/doc/TaskJuggler/Query.html +234 -232
  126. data/doc/TaskJuggler/RTFHandlers.html +11 -1
  127. data/doc/TaskJuggler/RTFNavigator.html +11 -1
  128. data/doc/TaskJuggler/RTFQuery.html +11 -1
  129. data/doc/TaskJuggler/RTFReport.html +11 -1
  130. data/doc/TaskJuggler/RTFReportLink.html +11 -1
  131. data/doc/TaskJuggler/RTFWithQuerySupport.html +11 -1
  132. data/doc/TaskJuggler/RealFormat.html +12 -2
  133. data/doc/TaskJuggler/RealFormatAttribute.html +15 -5
  134. data/doc/TaskJuggler/ReferenceAttribute.html +38 -28
  135. data/doc/TaskJuggler/Report.html +96 -113
  136. data/doc/TaskJuggler/ReportBase.html +161 -152
  137. data/doc/TaskJuggler/ReportContext.html +11 -1
  138. data/doc/TaskJuggler/ReportServer.html +59 -48
  139. data/doc/TaskJuggler/ReportServerIface.html +51 -41
  140. data/doc/TaskJuggler/ReportServerRecord.html +11 -1
  141. data/doc/TaskJuggler/ReportServlet.html +11 -1
  142. data/doc/TaskJuggler/ReportTable.html +46 -25
  143. data/doc/TaskJuggler/ReportTableCell.html +296 -275
  144. data/doc/TaskJuggler/ReportTableColumn.html +14 -4
  145. data/doc/TaskJuggler/ReportTableLegend.html +11 -1
  146. data/doc/TaskJuggler/ReportTableLine.html +19 -7
  147. data/doc/TaskJuggler/Resource.html +12 -2
  148. data/doc/TaskJuggler/ResourceListAttribute.html +40 -30
  149. data/doc/TaskJuggler/ResourceListRE.html +11 -1
  150. data/doc/TaskJuggler/ResourceScenario.html +708 -565
  151. data/doc/TaskJuggler/RichText.html +54 -36
  152. data/doc/TaskJuggler/RichTextAttribute.html +31 -21
  153. data/doc/TaskJuggler/RichTextDocument.html +11 -1
  154. data/doc/TaskJuggler/RichTextElement.html +11 -1
  155. data/doc/TaskJuggler/RichTextFunctionExample.html +11 -1
  156. data/doc/TaskJuggler/RichTextFunctionHandler.html +11 -1
  157. data/doc/TaskJuggler/RichTextImage.html +11 -1
  158. data/doc/TaskJuggler/RichTextIntermediate.html +81 -71
  159. data/doc/TaskJuggler/RichTextParser.html +88 -33
  160. data/doc/TaskJuggler/RichTextScanner.html +45 -35
  161. data/doc/TaskJuggler/RichTextSnip.html +11 -1
  162. data/doc/TaskJuggler/RichTextSyntaxRules.html +436 -389
  163. data/doc/TaskJuggler/Scenario.html +11 -1
  164. data/doc/TaskJuggler/ScenarioData.html +11 -1
  165. data/doc/TaskJuggler/ScenarioListAttribute.html +23 -13
  166. data/doc/TaskJuggler/Scoreboard.html +92 -73
  167. data/doc/TaskJuggler/SheetHandlerBase.html +11 -1
  168. data/doc/TaskJuggler/SheetReceiver.html +11 -1
  169. data/doc/TaskJuggler/SheetSender.html +11 -1
  170. data/doc/TaskJuggler/Shift.html +11 -1
  171. data/doc/TaskJuggler/ShiftAssignment.html +11 -1
  172. data/doc/TaskJuggler/ShiftAssignments.html +11 -1
  173. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +24 -14
  174. data/doc/TaskJuggler/ShiftScenario.html +11 -1
  175. data/doc/TaskJuggler/SimpleQueryExpander.html +11 -1
  176. data/doc/TaskJuggler/SortListAttribute.html +21 -11
  177. data/doc/TaskJuggler/SourceFileInfo.html +11 -1
  178. data/doc/TaskJuggler/StatusSheetReceiver.html +11 -1
  179. data/doc/TaskJuggler/StatusSheetReport.html +11 -1
  180. data/doc/TaskJuggler/StatusSheetSender.html +112 -11
  181. data/doc/TaskJuggler/StringAttribute.html +23 -13
  182. data/doc/TaskJuggler/SymbolAttribute.html +19 -9
  183. data/doc/TaskJuggler/SyntaxReference.html +80 -71
  184. data/doc/TaskJuggler/TOCEntry.html +11 -1
  185. data/doc/TaskJuggler/TSResourceRecord.html +11 -1
  186. data/doc/TaskJuggler/TSTaskRecord.html +11 -1
  187. data/doc/TaskJuggler/TableColumnDefinition.html +11 -1
  188. data/doc/TaskJuggler/TableOfContents.html +11 -1
  189. data/doc/TaskJuggler/TableReport.html +422 -411
  190. data/doc/TaskJuggler/Task.html +11 -1
  191. data/doc/TaskJuggler/TaskDependency.html +11 -1
  192. data/doc/TaskJuggler/TaskListAttribute.html +33 -23
  193. data/doc/TaskJuggler/TaskListRE.html +11 -1
  194. data/doc/TaskJuggler/TaskScenario.html +2007 -1919
  195. data/doc/TaskJuggler/TextFormatter.html +11 -1
  196. data/doc/TaskJuggler/TextParser.html +421 -612
  197. data/doc/TaskJuggler/TextParser/Pattern.html +410 -211
  198. data/doc/TaskJuggler/TextParser/Rule.html +224 -152
  199. data/doc/TaskJuggler/TextParser/StackElement.html +190 -28
  200. data/doc/TaskJuggler/TextParser/State.html +989 -0
  201. data/doc/TaskJuggler/TextParser/StateTransition.html +782 -0
  202. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +25 -14
  203. data/doc/TaskJuggler/TextParser/TokenDoc.html +11 -1
  204. data/doc/TaskJuggler/TextReport.html +11 -1
  205. data/doc/TaskJuggler/TextScanner.html +285 -273
  206. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +17 -7
  207. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +24 -14
  208. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +11 -1
  209. data/doc/TaskJuggler/TextScanner/StreamHandle.html +64 -52
  210. data/doc/TaskJuggler/TimeSheet.html +11 -1
  211. data/doc/TaskJuggler/TimeSheetReceiver.html +11 -1
  212. data/doc/TaskJuggler/TimeSheetRecord.html +11 -1
  213. data/doc/TaskJuggler/TimeSheetReport.html +11 -1
  214. data/doc/TaskJuggler/TimeSheetSender.html +11 -1
  215. data/doc/TaskJuggler/TimeSheetSummary.html +11 -1
  216. data/doc/TaskJuggler/TimeSheets.html +11 -1
  217. data/doc/TaskJuggler/Tj3AppBase.html +11 -1
  218. data/doc/TaskJuggler/Tj3Client.html +11 -1
  219. data/doc/TaskJuggler/Tj3Daemon.html +11 -1
  220. data/doc/TaskJuggler/Tj3SheetAppBase.html +11 -1
  221. data/doc/TaskJuggler/Tj3SsReceiver.html +11 -1
  222. data/doc/TaskJuggler/Tj3SsSender.html +11 -1
  223. data/doc/TaskJuggler/Tj3TsReceiver.html +11 -1
  224. data/doc/TaskJuggler/Tj3TsSender.html +11 -1
  225. data/doc/TaskJuggler/Tj3TsSummary.html +11 -1
  226. data/doc/TaskJuggler/TjException.html +11 -1
  227. data/doc/TaskJuggler/TjTime.html +474 -324
  228. data/doc/TaskJuggler/TjpExample.html +11 -1
  229. data/doc/TaskJuggler/TjpExportRE.html +11 -1
  230. data/doc/TaskJuggler/TjpSyntaxRules.html +3731 -3662
  231. data/doc/TaskJuggler/URLParameter.html +11 -1
  232. data/doc/TaskJuggler/UserManual.html +11 -1
  233. data/doc/TaskJuggler/VimSyntax.html +11 -1
  234. data/doc/TaskJuggler/WebServer.html +11 -1
  235. data/doc/TaskJuggler/WorkingHours.html +295 -221
  236. data/doc/TaskJuggler/WorkingHoursAttribute.html +11 -1
  237. data/doc/TaskJuggler/XMLBlob.html +11 -1
  238. data/doc/TaskJuggler/XMLComment.html +11 -1
  239. data/doc/TaskJuggler/XMLDocument.html +11 -1
  240. data/doc/TaskJuggler/XMLElement.html +11 -1
  241. data/doc/TaskJuggler/XMLNamedText.html +11 -1
  242. data/doc/TaskJuggler/XMLText.html +11 -1
  243. data/doc/index.html +694 -624
  244. data/doc/lib/AppConfig_rb.html +1 -1
  245. data/doc/lib/Attributes_rb.html +1 -1
  246. data/doc/lib/Booking_rb.html +1 -1
  247. data/doc/lib/DataCache_rb.html +69 -0
  248. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  249. data/doc/lib/ProjectFileParser_rb.html +1 -1
  250. data/doc/lib/ProjectFileScanner_rb.html +1 -1
  251. data/doc/lib/Project_rb.html +1 -1
  252. data/doc/lib/PropertyList_rb.html +1 -1
  253. data/doc/lib/Query_rb.html +1 -1
  254. data/doc/lib/RealFormat_rb.html +1 -1
  255. data/doc/lib/ResourceScenario_rb.html +1 -1
  256. data/doc/lib/Resource_rb.html +1 -1
  257. data/doc/lib/RichTextParser_rb.html +1 -1
  258. data/doc/lib/RichTextScanner_rb.html +1 -1
  259. data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
  260. data/doc/lib/RichText_rb.html +1 -1
  261. data/doc/lib/Scoreboard_rb.html +1 -1
  262. data/doc/lib/StatusSheetSender_rb.html +1 -1
  263. data/doc/lib/SyntaxReference_rb.html +1 -1
  264. data/doc/lib/TaskJuggler_rb.html +1 -1
  265. data/doc/lib/TaskScenario_rb.html +3 -1
  266. data/doc/lib/TextParser/Pattern_rb.html +3 -1
  267. data/doc/lib/TextParser/Rule_rb.html +3 -1
  268. data/doc/lib/TextParser/StackElement_rb.html +3 -1
  269. data/doc/lib/TextParser/State_rb.html +65 -0
  270. data/doc/lib/TextParser_rb.html +1 -1
  271. data/doc/lib/TextScanner_rb.html +1 -1
  272. data/doc/lib/Tj3Config_rb.html +1 -1
  273. data/doc/lib/TjTime_rb.html +1 -1
  274. data/doc/lib/TjpSyntaxRules_rb.html +1 -1
  275. data/doc/lib/WorkingHours_rb.html +3 -1
  276. data/doc/lib/daemon/ReportServer_rb.html +1 -1
  277. data/doc/lib/reports/CSVFile_rb.html +1 -1
  278. data/doc/lib/reports/CollisionDetector_rb.html +67 -0
  279. data/doc/lib/reports/GanttChart_rb.html +1 -1
  280. data/doc/lib/reports/GanttRouter_rb.html +3 -1
  281. data/doc/lib/reports/Navigator_rb.html +1 -1
  282. data/doc/lib/reports/ReportBase_rb.html +1 -1
  283. data/doc/lib/reports/ReportTableCell_rb.html +1 -1
  284. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  285. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  286. data/doc/lib/reports/ReportTable_rb.html +1 -1
  287. data/doc/lib/reports/Report_rb.html +1 -1
  288. data/doc/lib/reports/TableReport_rb.html +1 -1
  289. data/doc/lib/taskjuggler3_rb.html +1 -1
  290. data/examples/tutorial.tjp +1 -2
  291. data/lib/AppConfig.rb +10 -4
  292. data/lib/Attributes.rb +4 -4
  293. data/lib/DataCache.rb +124 -0
  294. data/lib/KeywordDocumentation.rb +5 -5
  295. data/lib/Project.rb +54 -10
  296. data/lib/ProjectFileParser.rb +10 -9
  297. data/lib/ProjectFileScanner.rb +38 -25
  298. data/lib/PropertyList.rb +6 -4
  299. data/lib/Query.rb +0 -8
  300. data/lib/RealFormat.rb +1 -1
  301. data/lib/Resource.rb +1 -1
  302. data/lib/ResourceScenario.rb +96 -31
  303. data/lib/RichText.rb +17 -5
  304. data/lib/RichTextParser.rb +22 -9
  305. data/lib/RichTextScanner.rb +34 -34
  306. data/lib/RichTextSyntaxRules.rb +41 -36
  307. data/lib/Scoreboard.rb +16 -7
  308. data/lib/StatusSheetSender.rb +63 -0
  309. data/lib/SyntaxReference.rb +9 -10
  310. data/lib/TaskJuggler.rb +28 -4
  311. data/lib/TaskScenario.rb +66 -19
  312. data/lib/TextParser.rb +219 -384
  313. data/lib/TextParser/Pattern.rb +168 -49
  314. data/lib/TextParser/Rule.rb +33 -17
  315. data/lib/TextParser/StackElement.rb +42 -2
  316. data/lib/TextParser/State.rb +175 -0
  317. data/lib/TextScanner.rb +19 -15
  318. data/lib/Tj3Config.rb +1 -1
  319. data/lib/TjTime.rb +111 -3
  320. data/lib/TjpSyntaxRules.rb +122 -66
  321. data/lib/WorkingHours.rb +91 -186
  322. data/lib/daemon/ReportServer.rb +3 -2
  323. data/lib/reports/CSVFile.rb +1 -1
  324. data/lib/reports/CollisionDetector.rb +177 -0
  325. data/lib/reports/GanttChart.rb +25 -41
  326. data/lib/reports/GanttRouter.rb +104 -233
  327. data/lib/reports/Navigator.rb +1 -1
  328. data/lib/reports/Report.rb +9 -33
  329. data/lib/reports/ReportBase.rb +0 -1
  330. data/lib/reports/ReportTable.rb +19 -8
  331. data/lib/reports/ReportTableCell.rb +61 -25
  332. data/lib/reports/ReportTableColumn.rb +2 -2
  333. data/lib/reports/ReportTableLine.rb +4 -2
  334. data/lib/reports/TableReport.rb +1 -0
  335. data/lib/taskjuggler3.rb +0 -1
  336. data/manual/Installation +7 -3
  337. data/manual/Intro +12 -10
  338. data/manual/The_TaskJuggler_Syntax +4 -4
  339. data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -14
  340. data/test/TestSuite/CSV-Reports/genrefs +1 -1
  341. data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -4
  342. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -22
  343. data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -14
  344. data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -14
  345. data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -14
  346. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -14
  347. data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -14
  348. data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +32 -24
  349. data/test/TestSuite/CSV-Reports/weekly-Reference.csv +13 -0
  350. data/test/TestSuite/CSV-Reports/weekly.tjp +9 -0
  351. data/test/TestSuite/HTML-Reports/css/tjreport.css +7 -2
  352. data/test/TestSuite/HTML-Reports/depArrows.html +839 -830
  353. data/test/TestSuite/HTML-Reports/depArrows.tjp +12 -12
  354. data/test/TestSuite/HTML-Reports/profile.html +37581 -0
  355. data/test/TestSuite/ReportGenerator/Errors/no_report_defined.tjp +7 -0
  356. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +1 -1
  357. data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/missing-reports +2 -0
  358. data/test/TestSuite/StatusSheets/run +2 -0
  359. data/test/TestSuite/Syntax/Correct/Booking.tjp +13 -5
  360. data/test/TestSuite/Syntax/Correct/ResourceRoot.tjp +21 -0
  361. data/test/TestSuite/Syntax/Correct/RollupResource.tjp +21 -0
  362. data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +1 -1
  363. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  364. data/test/TestSuite/Syntax/Errors/include_before_project.tjp +2 -0
  365. data/test/TestSuite/Syntax/Errors/no_reduce.tjp +6 -0
  366. data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
  367. data/test/TestSuite/TimeSheets/run +1 -1
  368. data/test/test_CSV-Reports.rb +2 -4
  369. data/test/test_CollisionDetector.rb +85 -0
  370. data/test/test_Project.rb +2 -2
  371. data/test/test_ProjectFileScanner.rb +73 -31
  372. data/test/test_Query.rb +2 -2
  373. data/test/test_ReportGenerator.rb +1 -1
  374. data/test/test_RichText.rb +4 -4
  375. data/test/test_WorkingHours.rb +150 -11
  376. metadata +75 -67
  377. data/test/TestSuite/ReportGenerator/Errors/css/tjreport.css +0 -407
  378. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +0 -26
  379. data/test/TestSuite/Scheduler/Correct/Allocate.html +0 -3210
  380. data/test/TestSuite/Scheduler/Correct/Container.html +0 -349
  381. data/test/TestSuite/Scheduler/Correct/Limits.html +0 -4964
  382. data/test/TestSuite/Scheduler/Correct/Shift.html +0 -1719
  383. data/test/TestSuite/Scheduler/Correct/Shift2.html +0 -476
  384. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -66
  385. data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
  386. data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
  387. data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
  388. data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
  389. data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
  390. data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
  391. data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
  392. data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
  393. data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
  394. data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
  395. data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
  396. data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +0 -1301
  397. data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +0 -66
  398. data/test/TestSuite/Scheduler/Errors/css/tjreport.css +0 -407
  399. data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
  400. data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
  401. data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
  402. data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
  403. data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
  404. data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
  405. data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
  406. data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
  407. data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
  408. data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
  409. data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
  410. data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +0 -1301
  411. data/test/TestSuite/StatusSheets/resrep.tji +0 -7
  412. data/test/TestSuite/StatusSheets/tj3d.log +0 -312
  413. data/test/TestSuite/Syntax/Correct/Managers.html +0 -263
  414. data/test/TestSuite/TimeSheets/acceptable_intervals +0 -1
  415. data/test/TestSuite/TimeSheets/statussheets.log +0 -1
@@ -0,0 +1,7 @@
1
+ project "test" 2010-05-23 +1w
2
+
3
+ task "foo"
4
+
5
+ # MARK: warning 0 no_report_defined
6
+ # MARK: warning 0 all_formats_empty
7
+
@@ -13,8 +13,8 @@ textreport r1 "R1" {
13
13
  textreport r2 "R2" {
14
14
  center "<[report id='r3']>"
15
15
  }
16
+ # MARK: error 19 rtp_report_recursion
16
17
  textreport r3 "R3" {
17
18
  left "Hello, world!"
18
- # MARK: error 19 rtp_report_recursion
19
19
  center "<[report id='r1']>"
20
20
  }
@@ -0,0 +1,2 @@
1
+ resource1
2
+ resource2
@@ -34,6 +34,8 @@ tj3ss_sender --dryrun -e 2002-03-02 > sender.log || error "sender1"
34
34
  check "From: foo@bar.com" sender.log 2
35
35
  check "Content-Disposition: attachment;" sender.log 2
36
36
  check "^statussheet " sender.log 2
37
+ check "^resource1" sender.log 0
38
+ check "^resource2" sender.log 2
37
39
 
38
40
  # Run a receiver test
39
41
  tj3ss_receiver --dryrun < boss_mail >> receiver.log || error "rec1"
@@ -17,10 +17,18 @@ task test "Testing" {
17
17
  }
18
18
 
19
19
  supplement resource tux {
20
- # This is the work that has been done up until now by tux.
21
- booking test 2007-01-06 +8h { sloppy 2 }
22
- booking test 2007-01-08 +4h,
23
- 2007-01-09 +4h { sloppy 2 }
24
- # Book interval that extends into off-hours.
20
+ # Book a whole day (8 hours). The 1 hour lunch break is skipped.
21
+ booking test 2007-01-06-9:00 +9h { sloppy 1 }
22
+ # Book 2 days in the afternoon, 4 hours each.
23
+ booking test 2007-01-08-13:00 +4h,
24
+ 2007-01-09-13:00 +4h
25
+ # This is a common mistake. With standard working hours, this will
26
+ # yield a zero time booking! The interval is midnight to 8am. So
27
+ # it's outside of the working hours and 'sloopy 2' surpresses the
28
+ # warning.
29
+ booking test 2007-01-11 +8h { sloppy 2 }
30
+ # Use 'overtime' to book off-hour slots. This booking will book the
31
+ # full 10 hours, ignoring the lunch break and adding an extra hour
32
+ # in the morning.
25
33
  booking test 2007-01-11-8:00 +10h { overtime 1 }
26
34
  }
@@ -0,0 +1,21 @@
1
+ project "Test" "1.0" 2010-11-10 +2m
2
+
3
+ resource org "Org" {
4
+ resource team1 "Team1" {
5
+ resource r1 "R1"
6
+ resource r2 "R2"
7
+ resource r3 "R3"
8
+ }
9
+ resource r4 "R4"
10
+ }
11
+ resource r5 "R5"
12
+
13
+ task "T"
14
+
15
+ resourcereport "ResourceRoot" {
16
+ formats html
17
+ columns name, id
18
+ # Only list the Team1 as if it would be a top-level resource.
19
+ resourceroot team1
20
+ }
21
+
@@ -0,0 +1,21 @@
1
+ project "Test" "1.0" 2010-11-10 +2m
2
+
3
+ resource org "Org" {
4
+ resource team1 "Team1" {
5
+ resource r1 "R1"
6
+ resource r2 "R2"
7
+ resource r3 "R3"
8
+ }
9
+ resource r4 "R4"
10
+ }
11
+ resource r5 "R5"
12
+
13
+ task "T"
14
+
15
+ resourcereport "RollupResource" {
16
+ formats html
17
+ columns name, id
18
+ # Don't list the Team1 resources.
19
+ rollupresource plan.id = 'team1'
20
+ }
21
+
@@ -1,4 +1,4 @@
1
- project prj "Taskroot Example" "1.0" 2005-07-22 - 2005-08-26
1
+ project "Taskroot Example" 2005-07-22 - 2005-08-26
2
2
 
3
3
  task items "Project breakdown" {
4
4
  start 2005-07-22
@@ -1 +1 @@
1
- # MARK: error 2 unexpctd_token
1
+ # MARK: error 1 unexpctd_token
@@ -0,0 +1,2 @@
1
+ # MARK: error 2 include_before_project
2
+ include "foo.tji"
@@ -0,0 +1,6 @@
1
+ project test "Test" "1.0" 2010-11-06 +1m
2
+
3
+ task t "T" {
4
+ # MARK: error 5 no_reduce
5
+ effort 1dd
6
+ }
@@ -2,7 +2,7 @@ project "Test" 2009-11-28 +2m
2
2
 
3
3
  task t "T" {
4
4
  journalentry 2009-11-28 "Just testing" {
5
- # MARK: error 7 unsupported_token
5
+ # MARK: error 8 unsupported_token
6
6
  summary -8<-
7
7
  This is all good.
8
8
  * This is bad.
@@ -50,7 +50,7 @@ tj3ts_summary --dryrun -e 2002-03-01 >> summary.log || error "summary"
50
50
  check "To: archive@bar.com" summary.log 2
51
51
  check "To: crew@bar.com" summary.log 1
52
52
  check "From: foo@bar.com" summary.log 7
53
- check "From: =?UTF-8?B?U8OpYmFzdGllbg==?= Bono <SBono@crappysoftware.com>" summary.log 1
53
+ check "Message-ID:" summary.log 8
54
54
  check "The following 5 person(s) have not yet submitted their time sheets" summary.log 4
55
55
  check "Weekly Report from" summary.log 4
56
56
  check "Green" summary.log 12
@@ -52,11 +52,9 @@ class TestScheduler < Test::Unit::TestCase
52
52
  # Compare the output CSV (passed as String) with the content of the CSV
53
53
  # reference files _refFile_.
54
54
  def compareCSVs(outStr, refFile)
55
- ref = []
56
- TaskJuggler::CSVFile.new(ref).read(refFile)
55
+ ref = TaskJuggler::CSVFile.new.read(refFile)
57
56
 
58
- out = []
59
- TaskJuggler::CSVFile.new(out).parse(outStr)
57
+ out = TaskJuggler::CSVFile.new.parse(outStr)
60
58
  assert(ref.length == out.length,
61
59
  "Line number mismatch (#{out.length} instead of #{ref.length}) " +
62
60
  "in #{refFile}")
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = test_GanttRouter.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib') if __FILE__ == $0
14
+
15
+ require 'test/unit'
16
+ require 'reports/GanttRouter'
17
+
18
+ class TaskJuggler
19
+
20
+ class TestCollisionDetector < Test::Unit::TestCase
21
+
22
+ def test_collisions
23
+ # To test the collion?() method we use a fix block area and then try
24
+ # various lines that either collide or not.
25
+ #
26
+ # 2,2
27
+ # +--+
28
+ # | |
29
+ # +--+
30
+ # 4,4
31
+ #
32
+ # We use the same set of lines for horizontal and vertical tests. The
33
+ # first value is the x or y coordinate of the line, the tuple is the start
34
+ # and end coordinate in the other dimension. The third value is the
35
+ # expected result.
36
+ lines = [
37
+ [ [ 1, [0, 1] ], false ],
38
+ [ [ 2, [0, 1] ], false ],
39
+ [ [ 3, [0, 1] ], false ],
40
+ [ [ 4, [0, 1] ], false ],
41
+ [ [ 5, [0, 1] ], false ],
42
+ [ [ 1, [0, 2] ], false ],
43
+ [ [ 2, [0, 2] ], true ],
44
+ [ [ 3, [0, 2] ], true ],
45
+ [ [ 4, [0, 2] ], true ],
46
+ [ [ 5, [0, 2] ], false ],
47
+ [ [ 1, [0, 4] ], false ],
48
+ [ [ 2, [0, 4] ], true ],
49
+ [ [ 3, [0, 4] ], true ],
50
+ [ [ 4, [0, 4] ], true ],
51
+ [ [ 5, [0, 4] ], false ],
52
+ [ [ 1, [0, 5] ], false ],
53
+ [ [ 2, [0, 5] ], true ],
54
+ [ [ 3, [0, 5] ], true ],
55
+ [ [ 4, [0, 5] ], true ],
56
+ [ [ 5, [0, 6] ], false ],
57
+ [ [ 1, [4, 6] ], false ],
58
+ [ [ 2, [4, 6] ], true ],
59
+ [ [ 3, [4, 6] ], true ],
60
+ [ [ 4, [4, 6] ], true ],
61
+ [ [ 5, [4, 6] ], false ],
62
+ [ [ 1, [5, 6] ], false ],
63
+ [ [ 2, [5, 6] ], false],
64
+ [ [ 3, [5, 6] ], false ],
65
+ [ [ 4, [5, 6] ], false ],
66
+ [ [ 5, [5, 6] ], false ]
67
+ ]
68
+ # Try horizontal lines first.
69
+ cd = CollisionDetector.new(10, 10)
70
+ cd.addBlockedZone(2, 2, 3, 3, true, true)
71
+
72
+ lines.each do |line|
73
+ assert_equal(line[1], cd.collision?(*(line[0] + [ true ])),
74
+ "Horizontal #{line[0]} is not #{line[1]}")
75
+ end
76
+ lines.each do |line|
77
+ assert_equal(line[1], cd.collision?(*(line[0] + [ false ])),
78
+ "Vertical #{line[0]} is not #{line[1]}")
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ end
85
+
data/test/test_Project.rb CHANGED
@@ -42,12 +42,12 @@ class TestProject < Test::Unit::TestCase
42
42
  assert_equal(p['rate'], 100.0)
43
43
 
44
44
  t = Task.new(p, 'foo', 'Foo', nil)
45
- t['start', 0] = TjTime.new('2008-07-25 9:00')
45
+ t['start', 0] = TjTime.new('2008-07-25-9:00')
46
46
  t['duration', 0] = 10
47
47
  assert_equal(p.task('foo'), t)
48
48
 
49
49
  p.schedule
50
- assert_equal(t['end', 0], TjTime.new('2008-07-25 19:00'))
50
+ assert_equal(t['end', 0], TjTime.new('2008-07-25-19:00'))
51
51
  p.generateReports(1)
52
52
  end
53
53
 
@@ -44,21 +44,21 @@ comment */
44
44
  EOT
45
45
 
46
46
  ref = [
47
- ['ID', 'Hello', 1],
48
- ['ID', 'world', 1],
49
- ['INTEGER', 1, 1],
50
- ['FLOAT', 2.0, 2],
51
- ['DATE', TjTime.new('2008-12-14'), 3],
52
- ['ID_WITH_COLON', 'foo', 5],
53
- ['ABSOLUTE_ID', 'a.b.c', 6],
54
- ['LITERAL', '-', 6],
55
- ['LITERAL', '$', 6],
56
- ['MACRO', 'A Macro', 6],
57
- ['TIME', ((15 * 60) + 23) * 60, 7],
58
- ['STRING', 'A string', 7],
59
- ['STRING', "It's a string", 8],
60
- ['STRING', "A\nmult\"i line\nstring", 9],
61
- ['.', '<END>', 14 ]
47
+ [:ID, 'Hello', 1],
48
+ [:ID, 'world', 1],
49
+ [:INTEGER, 1, 1],
50
+ [:FLOAT, 2.0, 2],
51
+ [:DATE, TjTime.new('2008-12-14'), 3],
52
+ [:ID_WITH_COLON, 'foo', 5],
53
+ [:ABSOLUTE_ID, 'a.b.c', 6],
54
+ [:LITERAL, '-', 6],
55
+ [:LITERAL, '$', 6],
56
+ [:MACRO, 'A Macro', 6],
57
+ [:TIME, time(15, 23), 7],
58
+ [:STRING, 'A string', 7],
59
+ [:STRING, "It's a string", 8],
60
+ [:STRING, "A\nmult\"i line\nstring", 9],
61
+ [:eof, '<END>', 14 ]
62
62
  ]
63
63
 
64
64
  check(text, ref)
@@ -76,19 +76,57 @@ EOT
76
76
  ]
77
77
 
78
78
  ref = [
79
- ['ID', 'This', 1],
80
- ['ID', 'great', 1],
81
- ['ID', 'software', 1],
82
- ['ID', 'macro', 2],
83
- ['ID', 'with', 2],
84
- ['ID', 'arg1', 2],
85
- ['ID', 'argument', 2],
86
- ['.', '<END>', 3]
79
+ [:ID, 'This', 1],
80
+ [:ID, 'great', 1],
81
+ [:ID, 'software', 1],
82
+ [:ID, 'macro', 2],
83
+ [:ID, 'with', 2],
84
+ [:ID, 'arg1', 2],
85
+ [:ID, 'argument', 2],
86
+ [:eof, '<END>', 3]
87
87
  ]
88
88
 
89
89
  check(text, ref, macros)
90
90
  end
91
91
 
92
+ def test_time
93
+ text = <<'EOT'
94
+ 0:00
95
+ 00:00
96
+ 1:00
97
+ 11:59
98
+ 12:01
99
+ 24:00
100
+ EOT
101
+ ref = [
102
+ [:TIME, time(0, 0), 1],
103
+ [:TIME, time(0, 0), 2],
104
+ [:TIME, time(1, 0), 3],
105
+ [:TIME, time(11, 59), 4],
106
+ [:TIME, time(12, 1), 5],
107
+ [:TIME, time(24, 0), 6],
108
+ [:eof, '<END>', 7]
109
+ ]
110
+
111
+ check(text, ref)
112
+ end
113
+
114
+ def test_date
115
+ text = <<'EOT'
116
+ 1970-01-01
117
+ 2035-12-31-23:59:59
118
+ 2010-08-11-23:10
119
+ EOT
120
+ ref = [
121
+ [:DATE, TjTime.new('1970-01-01'), 1],
122
+ [:DATE, TjTime.new('2035-12-31-23:59:59'), 2],
123
+ [:DATE, TjTime.new('2010-08-11-23:10'), 3],
124
+ [:eof, '<END>', 4]
125
+ ]
126
+
127
+ check(text, ref)
128
+ end
129
+
92
130
  def test_macroDef
93
131
  text = <<'EOT'
94
132
  [ foo ]
@@ -106,13 +144,13 @@ EOT
106
144
  EOT
107
145
 
108
146
  ref = [
109
- [ 'MACRO', ' foo ', 1 ],
110
- [ 'MACRO', "\n bar ", 2 ],
111
- [ 'MACRO', " foo\n ", 4 ],
112
- [ 'MACRO', "\n bar\n ", 6 ],
113
- [ 'MACRO', '', 9 ],
114
- [ 'MACRO', "\n ", 10 ],
115
- [ '.', '<END>', 13 ]
147
+ [ :MACRO, ' foo ', 1 ],
148
+ [ :MACRO, "\n bar ", 2 ],
149
+ [ :MACRO, " foo\n ", 4 ],
150
+ [ :MACRO, "\n bar\n ", 6 ],
151
+ [ :MACRO, '', 9 ],
152
+ [ :MACRO, "\n ", 10 ],
153
+ [ :eof, '<END>', 13 ]
116
154
  ]
117
155
 
118
156
  check(text, ref)
@@ -124,7 +162,7 @@ EOT
124
162
  [ 'foo', 'hello' ]
125
163
  ]
126
164
  ref = [
127
- [ 'ID', 'hello', 1 ]
165
+ [ :ID, 'hello', 1 ]
128
166
  ]
129
167
 
130
168
  check(text, ref, macros)
@@ -132,6 +170,10 @@ EOT
132
170
 
133
171
  private
134
172
 
173
+ def time(h, m)
174
+ (h * 60 + m) * 60
175
+ end
176
+
135
177
  def check(text, ref, macros = [])
136
178
  s = TaskJuggler::ProjectFileScanner.new(text, MessageHandler.new(true))
137
179
  s.open(true)
data/test/test_Query.rb CHANGED
@@ -23,8 +23,8 @@ class TestQuery < Test::Unit::TestCase
23
23
  def setup
24
24
  @mh = MessageHandler.new
25
25
  @p = TaskJuggler::Project.new('id', 'name', 'ver', @mh)
26
- @p['start'] = TjTime.new(1202491644)
27
- @p['end'] = TjTime.new(1202439409)
26
+ @p['start'] = TjTime.new('2010-09-25')
27
+ @p['end'] = TjTime.new('2010-09-25')
28
28
  end
29
29
 
30
30
  def teardown
@@ -53,7 +53,7 @@ class TestReportGenerator < Test::Unit::TestCase
53
53
  Dir.glob(path + 'TestSuite/ReportGenerator/Correct/*.tjp').each do |f|
54
54
  ENV['TZ'] = 'Europe/Berlin'
55
55
  tj = TaskJuggler.new(true)
56
- assert(tj.parse([ f ]), "Parser failed for ${f}")
56
+ assert(tj.parse([ f ]), "Parser failed for #{f}")
57
57
  assert(tj.schedule, "Scheduler failed for #{f}")
58
58
  assert(tj.generateReports(@tmpDir), "Report generator failed for #{f}")
59
59
  assert(tj.messageHandler.messages.empty?, "Unexpected error in #{f}")
@@ -47,10 +47,10 @@ class TestRichText < Test::Unit::TestCase
47
47
 
48
48
  assert_outputs(inp, tagged, str, html)
49
49
 
50
- assert_equal(true, newRichText(inp).empty?)
51
- assert_equal(true, newRichText("\n").empty?)
52
- assert_equal(true, newRichText("\n \n").empty?)
53
- assert_equal(false, newRichText("foo").empty?)
50
+ assert_equal(true, newRichText(inp).empty?, 'Empty string')
51
+ assert_equal(true, newRichText("\n").empty?, '\n')
52
+ assert_equal(true, newRichText("\n \n").empty?, '\n \n')
53
+ assert_equal(false, newRichText("foo").empty?, 'foo')
54
54
  end
55
55
 
56
56
  def test_one_word