Thanks for using JUnit! Support its development at https://junit.org/sponsoring UI Theme successfully changed to 'material' Reflections took 152 ms to scan 2 urls, producing 116 keys and 1151 values Insert 1000 word-index rows: 337 ms Update 1000 word-index rows: 452 ms Large disjunction over 1000 rows: 2103 ms ╷ └─ FWD Test ✔ ├─ tests.persistence.word_index.TestContainsCombinedConditions ✔ │ ├─ testContainsAndCharEquality ✔ │ ├─ testContainsAndLogicalTrue ✔ │ ├─ testContainsAndLogicalFalse ✔ │ ├─ testContainsOrCharEquality ✔ │ ├─ testContainsAndNumIndexBegins ✔ │ ├─ testContainsAndNumIndexRange ✔ │ ├─ testContainsAndMatches ✔ │ ├─ testTwoWordFieldsAnd ✔ │ ├─ testTwoWordFieldsOr ✔ │ ├─ testTwoContainsSameField ✔ │ ├─ testContainsWithComputedExpression ✔ │ ├─ testContainsInNestedAndOr ✔ │ ├─ testContainsAndCharGreaterEqual ✔ │ └─ testContainsCountAll ✔ ├─ tests.persistence.word_index.TestContainsDelimiters ✔ │ ├─ testWhitespaceAndPunctuationAreDelimiters ✔ │ ├─ testAlphanumericsAreNotDelimiters ✔ │ ├─ testNumericPunctuationKeepsSingleWord ✔ │ ├─ testPunctuationBeforeNonDigitStillSplits ✔ │ ├─ testHyphenSequenceMatchesReordered ✔ │ ├─ testMixedPunctuationTokens ✔ │ └─ testContainsEmptyMatchesNothing ✔ ├─ tests.persistence.word_index.TestContainsDisjunctions ✔ │ ├─ testManyInStringDisjunctions ✔ │ ├─ testMaxSeparateOrContains ✔ │ └─ testDisjunctionWithWildcards ✔ ├─ tests.persistence.word_index.TestContainsDynamic ✔ │ ├─ testValidDynamicQuery ✔ │ ├─ testMultiWildcardWords ✔ │ ├─ testInvalidQueryStringRaisesError ✔ │ ├─ testContainsOnFieldWithoutWordIndexRaisesError ✔ │ └─ testDuplicateWordIndexFieldError ✔ ├─ tests.persistence.word_index.TestContainsExpressions ✔ │ ├─ testContainsAndNonIndexedField ✔ │ ├─ testContainsOrNonIndexedField ✔ │ ├─ testComplementOfContains ✔ │ ├─ testConjunctiveNormalForm ✔ │ ├─ testDisjunctiveNormalForm ✔ │ ├─ testContainsExistence ✔ │ └─ testContainsInIfExpression ✔ ├─ tests.persistence.word_index.TestContainsExtent ✔ │ ├─ testValidFieldCharContainsChar ✔ │ ├─ testValidFieldCharExtentContainsChar ✔ │ ├─ testInvalidFieldCharContainsCharExtent ✔ │ ├─ testInvalidFieldCharExtentContainsCharExtent ✔ │ ├─ testValidFieldCharExtentContainsCharForFirst ✔ │ ├─ testValidFieldCharExtentContainsCharForLast ✔ │ └─ testValidFieldCharExtentContainsCharQuery ✔ ├─ tests.persistence.word_index.TestContainsExtentOutput ✔ │ └─ testExtentOutputMatchesExpected ✔ ├─ tests.persistence.word_index.TestContainsIndexSelection ✔ │ ├─ testWildcardSelectionCount ✔ │ ├─ testSelectionExactWord ✔ │ ├─ testSelectionDisjunction ✔ │ ├─ testSelectionConjunctionNoMatch ✔ │ ├─ testNaturalOrderIsWordIndexNotRecno ✘ Expected: 2,4,5,3,1, but was: 1,2,3,4,5, │ ├─ testExplicitByRecnoOverridesWordOrder ✔ │ └─ testRecordContentsMatchSelection ✔ ├─ tests.persistence.word_index.TestContainsJoins ✔ │ ├─ testMultiJoinFieldContains ✔ │ ├─ testGrandparentReferenceContains ✔ │ ├─ testLookupUsesParentField ✔ │ └─ testLookupConcatenatesParentField ✔ ├─ tests.persistence.word_index.TestContainsMultiWordContent ✔ │ ├─ testWordInMiddle ✔ │ ├─ testWordFox ✔ │ ├─ testRepeatedWordMatchesOncePerRecord ✔ │ ├─ testWordAtEnd ✔ │ ├─ testConjunctionAcrossSentence ✔ │ ├─ testConjunctionMissingWord ✔ │ ├─ testFirstAndLastWord ✔ │ ├─ testPhraseImplicitAnd ✔ │ ├─ testThreeWordPhrase ✔ │ ├─ testMissingWord ✔ │ ├─ testDisjunctionWithMissing ✔ │ ├─ testWildcardConjunction ✔ │ ├─ testSingleWordRecord ✔ │ ├─ testDuplicateSearchTerm ✔ │ └─ testTripleConjunction ✔ ├─ tests.persistence.word_index.TestContainsParamTypes ✔ │ ├─ testLiteralOperand ✔ │ ├─ testConcatenationOperand ✔ │ ├─ testLowerFunctionOperand ✔ │ ├─ testVariableOperand ✔ │ ├─ testUnknownValueOperand ✔ │ └─ testExpressionOperand ✔ ├─ tests.persistence.word_index.TestContainsPerformance ✔ │ ├─ testInsertPerformance ✔ │ ├─ testUpdatePerformance ✔ │ └─ testLargeDisjunctionPerformance ✔ ├─ tests.persistence.word_index.TestContainsPseudo ✔ │ └─ testPseudoQueryMatches ✔ ├─ tests.persistence.word_index.TestContainsQueryNavigation ✔ │ ├─ testGetFirst ✔ │ ├─ testGetFirstContent ✔ │ ├─ testGetNext ✔ │ ├─ testGetLast ✔ │ ├─ testGetPrevFromLast ✔ │ ├─ testCountViaGetNext ✔ │ ├─ testOffEndAfterLast ✔ │ ├─ testOffEndBeforeFirst ✔ │ ├─ testForwardOnlyCount ✔ │ ├─ testReopenAfterClose ✔ │ ├─ testRePrepareNarrows ✔ │ └─ testByDescendingFirst ✔ ├─ tests.persistence.word_index.TestContainsTriggers ✔ │ ├─ testInsertEmptyFieldHasNoWords ✔ │ ├─ testInsertUnknownFieldHasNoWords ✔ │ ├─ testInsertPopulatedFieldIsFound ✔ │ ├─ testUpdateWordFieldReplacesWords ✔ │ ├─ testUpdateNonWordFieldKeepsWords ✔ │ ├─ testUpdateWordFieldToEmptyRemovesWords ✔ │ ├─ testDuplicateWordsStillMatch ✔ │ ├─ testReorderedWordsMatchSameWay ✔ │ ├─ testCaseInsensitiveMatch ✔ │ ├─ testExtentInsertAndUpdate ✔ │ ├─ testTempTableInsertEmptyHasNoWords ✔ │ └─ testTempTableUpdateReplacesWords ✔ ├─ tests.persistence.word_index.TestContainsUpdateScenarios ✔ │ ├─ testAddWordViaUpdate ✔ │ ├─ testRemoveWordViaUpdate ✔ │ ├─ testReplaceWordViaUpdate ✔ │ ├─ testDeleteRecordRemovesFromIndex ✔ │ ├─ testUpdateToSameValueKeepsData ✔ │ ├─ testUpdateNonWordFieldRepeatedly ✔ │ ├─ testWhitespaceOnlyFieldHasNoWords ✔ │ ├─ testDelimitersOnlyFieldHasNoWords ✔ │ ├─ testAppendWord ✔ │ ├─ testPrependWord ✔ │ ├─ testMultipleRecordsCommonWord ✔ │ ├─ testUpdateAllRemoveCommonWord ✔ │ ├─ testEmptyToValueViaUpdate ✔ │ ├─ testExtentAddElement ✔ │ ├─ testExtentClearElement ✔ │ ├─ testExtentReplaceElement ✔ │ └─ testBulkInsertThenSearch ✔ ├─ tests.persistence.word_index.TestContainsWildcardScenarios ✔ │ ├─ testPrefixThreeChars ✔ │ ├─ testPrefixFourChars ✔ │ ├─ testPrefixFiveCharsExcludesApple ✔ │ ├─ testPrefixApplication ✔ │ ├─ testWildcardMatchesWholeFamily ✔ │ ├─ testExactWordNoWildcard ✔ │ ├─ testExactLongWord ✔ │ ├─ testPartialWordWithoutWildcardNoMatch ✔ │ ├─ testDogPrefix ✔ │ ├─ testDogExact ✔ │ ├─ testSingleLetterPrefix ✔ │ ├─ testTwoLetterPrefix ✔ │ ├─ testThreeLetterPrefix ✔ │ ├─ testFourLetterPrefix ✔ │ ├─ testPrefixNoMatch ✔ │ ├─ testUnknownPrefix ✔ │ ├─ testExactWordPlusWildcard ✔ │ ├─ testWildcardConjunctionNoMatch ✔ │ └─ testWildcardDisjunction ✔ ├─ tests.persistence.word_index.TestContainsWordBoundary ✔ │ ├─ testExactCatMatchesOnlyCat ✔ │ ├─ testExactCats ✔ │ ├─ testExactCategory ✔ │ ├─ testCatPrefixMatchesFamily ✔ │ ├─ testScatterExact ✔ │ ├─ testScatIsNotAsubstringMatch ✔ │ ├─ testConcatenateExact ✔ │ ├─ testConcatIsNotAsubstringMatch ✔ │ ├─ testCatsAndDogsConjunction ✔ │ ├─ testDogsExact ✔ │ ├─ testCategPrefix ✔ │ └─ testLeadingAsteriskRaisesError ✔ ├─ tests.persistence.word_index.TestForEachSorting ✔ │ ├─ testByF1 ✔ │ ├─ testByF3 ✔ │ ├─ testByF2ThenF3 ✔ │ ├─ testByF2ThenF1 ✔ │ ├─ testByF3ThenF1 ✔ │ ├─ testTest2ByG1ThenG2 ✔ │ └─ testTest2ByG2ThenG1 ✔ ├─ tests.persistence.word_index.ContainsCollationTest ✔ │ ├─ accentedLettersAreWordCharactersAndFold ✘ 7 of 22 cases disagree for group [i18n] seq 5401-5499; 5401 [acute-spelling-finds-all-three] expected [1,2,3], got [1,3]; 5402 [plain-spelling-finds-all-three] expected [1,2,3], got [2]; 5403 [upper-spelling-finds-all-three] expected [1,2,3], got [1,3]; 5407 [diaeresis-folds-to-plain] expected [4], got []; 5415 [cedilla-folds-to-c] expected [6], got []; 5419 [umlaut-folds-to-a] expected [7], got []; 5421 [accented-and-folded-in-one-expression] expected [1,2,3], got [] │ └─ everyCaseIsClaimedByArule ✔ ├─ tests.persistence.word_index.ContainsErrorRejectionTest ✔ │ ├─ fixtureTablesAreAvailable ✔ │ ├─ asteriskIsMisplacedOverTempTables ✔ │ ├─ asteriskIsMisplacedOverPermanentTables ✔ │ ├─ expressionEndsInAnOperatorOverTempTables ✔ │ ├─ expressionEndsInAnOperatorOverPermanentTables ✔ │ ├─ rightParenIsUnexpectedOverTempTables ✔ │ ├─ rightParenIsUnexpectedOverPermanentTables ✔ │ ├─ wordIsMissingBeforeAnOperatorOverTempTables ✔ │ ├─ wordIsMissingBeforeAnOperatorOverPermanentTables ✔ │ ├─ rightParenIsMissingOverTempTables ✔ │ ├─ rightParenIsMissingOverPermanentTables ✔ │ ├─ constructMayNotCarryAcontainsOverTempTables ✔ │ ├─ constructMayNotCarryAcontainsOverPermanentTables ✔ │ ├─ queryTextDoesNotParseOverTempTables ✘ 4 of 4 cases disagree for query texts OpenEdge does not read as a query over temp-tables; 4108 [find-first] expected error 247, got error 7325 "QUERY-PREPARE text must have 1 FOR EACH/PRESELECT for each query buffer. (7325)"; 4109 [contains-with-no-operand] error 247 text expected "** Unable to understand after -- "WHERE ctbasic.txt". (247)", got "** Unable to understand after -- "CONTAINS". (247)"; 4110 [contains-twice] expected error 247, got error 3398 "CONTAINS allowed only for word indexed field references. (3398)"; 4111 [where-keyword-missing] expected error 247, got error 7328 " ctbasic txt must be a quoted constant or an unabbreviated, unambiguous buffer/field reference for buffers known to query . (7328)" │ ├─ queryTextDoesNotParseOverPermanentTables ✘ 3 of 4 cases disagree for query texts OpenEdge does not read as a query over permanent tables; 4108 [find-first] expected error 247, got error 7325 "QUERY-PREPARE text must have 1 FOR EACH/PRESELECT for each query buffer. (7325)"; 4110 [contains-twice] expected error 247, got error 3398 "CONTAINS allowed only for word indexed field references. (3398)"; 4111 [where-keyword-missing] expected error 247, got error 7328 " ctpbasic txt must be a quoted constant or an unabbreviated, unambiguous buffer/field reference for buffers known to query . (7328)" │ ├─ operandWillNotResolveOverTempTables ✔ │ ├─ operandWillNotResolveOverPermanentTables ✔ │ ├─ queryTextDoesNotMatchTheBuffersOverTempTables ✔ │ ├─ queryTextDoesNotMatchTheBuffersOverPermanentTables ✔ │ ├─ dynamicQueryWithRejectedExpression ✔ │ ├─ conditionIsSeenByAdoBlock ✔ │ ├─ conditionIsRethrownByArepeatBlockThatThrows ✔ │ ├─ conditionIsAbsorbedByArepeatBlockThatLeaves ✔ │ ├─ badOperandIsRejectedBeforeTheJoinOpens ✘ a non-character operand in a join: expected prepare raised 223, query did not open, 0 rows, fetch raised nothing, got prepare accepted, query opened, 0 rows, fetch raised 223 │ ├─ malformedExpressionInAjoinIsRaisedAtTheFirstFetch ✔ │ ├─ everyRejectionIsClassified ✔ │ └─ noCaseExpectsAnErrorOutsideThisClass ✔ ├─ tests.persistence.word_index.ContainsExpressionTest ✔ │ ├─ singleWordMatching ✔ │ ├─ trailingAsteriskPrefixes ✔ │ ├─ andOrOperators ✔ │ ├─ precedenceAndParentheses ✔ │ ├─ theExpressionMayBeAnyCharacterExpression ✔ │ ├─ aLongcharOperandMustBeConvertedBeforeTheWhereClause ✔ │ ├─ aTildeEscapesNothing ✔ │ ├─ andOrNotAreSearchWordsNotOperators ✔ │ ├─ everyLexCaseIsClaimedByArule ✔ │ ├─ newlineSeparatedTermsAreAnImplicitAnd ✔ │ └─ sameStatementDifferentExpressions ✔ ├─ tests.persistence.word_index.ContainsFieldTest ✔ │ ├─ plainCharacterField ✔ │ ├─ secondIndependentWordIndex ✔ │ ├─ caseSensitiveField ✔ │ ├─ extentField ✔ │ ├─ extentFurtherElements ✔ │ └─ extentSubscriptIsIgnored ✔ ├─ tests.persistence.word_index.ContainsJoinTest ✔ │ ├─ containsOnFirstBufferOnly ✔ │ ├─ containsOnSecondBufferOnly ✔ │ ├─ containsOnBothBuffers ✔ │ ├─ joinOnLikeNamedWordIndexedFields ✔ │ └─ joinDoesNotDuplicateOuterRows ✔ ├─ tests.persistence.word_index.ContainsLockModeTest ✔ │ ├─ fixtureTablesAreAvailable ✔ │ ├─ readableLockModesDoNotChangeTheResult ✔ │ ├─ exclusiveLockOutsideAtransactionIsRefused ✘ 1 of 1 cases disagree for an EXCLUSIVE-LOCK CONTAINS query fetched outside a transaction; [exclusive-outside-transaction] expected error 2819, got no error │ ├─ exclusiveLockInsideAtransactionYieldsWritableRows ✔ │ └─ noWaitIsNotPartOfArecordPhrase ✘ 3 of 3 cases disagree for NO-WAIT appended to each lock mode of a CONTAINS query; [exclusive-no-wait] expected error 247, got no error; [share-no-wait] expected error 247, got no error; [no-lock-no-wait] expected error 247, got no error ├─ tests.persistence.word_index.ContainsPermanentTest ✔ │ ├─ fixtureTablesAreAvailable ✔ │ ├─ singleWordMatching ✔ │ ├─ trailingAsteriskPrefixes ✔ │ ├─ andOrOperators ✔ │ ├─ precedenceAndParentheses ✔ │ ├─ wordBreakRules ✔ │ ├─ plainCharacterField ✔ │ ├─ secondIndependentWordIndex ✔ │ ├─ caseSensitiveField ✔ │ ├─ extentField ✔ │ ├─ extentFieldEveryElementIsIndexed ✔ │ ├─ sortedQueries ✔ │ ├─ containsBesideApredicateThatIsNotAcontains ✔ │ ├─ severalContainsInOneWhereClause ✔ │ ├─ twoWordIndexesInOneWhereClause ✔ │ ├─ extentSubscriptIsIgnored ✔ │ ├─ joinOfTwoWordIndexedTables ✔ │ ├─ extentWordFoundInAnyElement ✔ │ ├─ writesAreVisibleImmediately ✔ │ ├─ acceptedQueryShapes ✔ │ ├─ dynamicNavigation ✔ │ └─ dynamicPreselectAttributes ✔ ├─ tests.persistence.word_index.ContainsPredicateTest ✔ │ ├─ containsBesideApredicateThatIsNotAcontains ✔ │ ├─ severalContainsInOneWhereClause ✔ │ └─ severalWordIndexesInOneWhereClause ✔ ├─ tests.persistence.word_index.ContainsQueryFormTest ✔ │ ├─ forEach_ ✔ │ ├─ forFirstIsAppliedBeforeTheSort ✔ │ ├─ forFirstWithNoMatchLeavesTheBufferEmpty ✔ │ ├─ leavingTheBlockEarly ✔ │ ├─ openQuery ✔ │ ├─ openQueryPreselect ✔ │ ├─ repeatPreselect ✔ │ ├─ dynamicQuery ✔ │ ├─ nestedBlocksOneInnerRow ✔ │ ├─ nestedBlocksAndExpressions ✔ │ ├─ nestedBlocksOuterDeDuplication ✔ │ ├─ aggregatesOverAcontainsResultSet ✔ │ ├─ namedBuffer ✔ │ ├─ twoBuffersOnOneTable ✔ │ ├─ breakByOverAcontainsResultSet ✔ │ ├─ breakByWithPerGroupAggregates ✔ │ ├─ containsInsideAmethod ✔ │ ├─ methodCalledRepeatedly ✔ │ └─ dynamicQueryWithNoMatch ✔ ├─ tests.persistence.word_index.ContainsQueryNavigationTest ✔ │ ├─ preselectNumResults ✔ │ ├─ preselectReadBackwards ✔ │ ├─ staticQueryNavigation ✔ │ ├─ staticQueryReadBackwards ✔ │ ├─ staticPreselectAttributes ✔ │ ├─ dynamicQueryNavigation ✔ │ ├─ dynamicQueryReopenedAndRePrepared ✔ │ └─ dynamicPreselectAttributes ✔ ├─ tests.persistence.word_index.ContainsQueryShapeTest ✔ │ └─ acceptedQueryShapes ✔ ├─ tests.persistence.word_index.ContainsResultOrderTest ✔ │ ├─ swappingTheGroupsSelectsTheSameRows ✔ │ ├─ naturalOrderFollowsTheLeadingGroup ✘ 4 of 4 cases disagree for the same expressions with no BY clause; [two-groups-forward] expected [1,3,2,4], got [1,2,3,4]; [two-groups-swapped] expected [1,4,2,3], got [1,2,3,4]; [three-way-forward] expected [7,10,8,12,9,11], got [7,8,9,10,11,12]; [three-way-swapped] expected [7,11,8,10,9,12], got [7,8,9,10,11,12] │ └─ andBindsTighterThanOrAcrossAwildcard ✔ ├─ tests.persistence.word_index.ContainsSortTest ✔ │ ├─ singleSortColumn ✔ │ ├─ severalSortColumns ✔ │ ├─ sortedResultSetIsDeDuplicated ✔ │ ├─ nonMatchingExpressionsWithSort ✔ │ ├─ everyCaseIsClaimedByArule ✔ │ ├─ aStaticSortClauseIsAppliedOnTopOfTheMatch ✔ │ └─ aRowMatchedBySeveralWordsIsReturnedOnce ✔ ├─ tests.persistence.word_index.ContainsTransactionTest ✔ │ ├─ fixtureTablesAreAvailable ✔ │ ├─ createRolledBackLeavesNoIndexEntry ✔ │ ├─ updateRolledBackRestoresTheOldWords ✔ │ └─ deleteRolledBackRestoresTheRow ✔ ├─ tests.persistence.word_index.ContainsUnknownTest ✔ │ ├─ unknownExpressionFromCaseTable ✔ │ ├─ unknownMatchesNothingAndRaisesNothing ✔ │ ├─ unknownDiffersFromMatchingEverything ✔ │ └─ unknownBehavesLikeEmptyExpression ✔ ├─ tests.persistence.word_index.ContainsWordBreakTest ✔ │ ├─ hyphenIsAwordCharacterOnlyBeforeAdigit ✔ │ ├─ periodAndCommaFollowTheHyphenRule ✔ │ ├─ underscoreApostropheAtPercentDollarAreWordCharacters ✔ │ ├─ punctuationAndWhitespaceAreDelimiters ✔ │ ├─ caseFoldingAndPrefixesAcrossTheFixture ✔ │ ├─ caretAndBangAreDelimitersToo ✔ │ └─ everyCaseIsClaimedByArule ✔ ├─ tests.persistence.word_index.TestContains ✔ │ ├─ testEscapedChar1 ✔ │ ├─ testEscapedChar2 ✔ │ ├─ testSimple ✔ │ ├─ testSimpleEmpty ✔ │ ├─ testSimpleWithSpace ✔ │ ├─ testSimpleWithSpaceHalf ✔ │ ├─ testSimpleWildCardValid ✔ │ ├─ testSimpleWildCardValidHalf ✔ │ ├─ testSimpleWildCardInvalid ✔ │ ├─ testDoubleInvalidUnexpectedEnd ✔ │ ├─ testDoubleInvalidNoSearch ✔ │ ├─ testDoubleInvalidNoFirstWord ✔ │ ├─ testDoubleInvalidParanthesis ✔ │ ├─ testDoubleValid ✔ │ ├─ testDoubleInvalidKeywordsNoError ✔ │ ├─ testDoubleSpaceAnd ✔ │ ├─ testDoubleValidWildcard ✔ │ ├─ testTripleValid ✔ │ ├─ testTripleInvalidEmpty ✔ │ ├─ testMultipleValidParanthesis ✔ │ ├─ testQueryEach ✔ │ ├─ testForFirst ✔ │ ├─ testOnlyDelimitersAfterAsteriskShouldNotThrowWildcardError ✔ │ ├─ testCharsAfterAsteriskShouldThrowWildcardError ✔ │ ├─ testNothingBetweenDelimitersAndAsteriskShouldNotThrowWildcardError ✔ │ ├─ testDelimiterTrimmedBeforeAsterisk ✔ │ ├─ testOffEnd1 ✘ Expected: TRUE but was: no │ ├─ testOffEnd2 ✔ │ ├─ testOffEnd3 ✘ Expected: TRUE but was: no │ ├─ testOffEnd4 ✔ │ ├─ testOpenStaticScrolling1 ✔ │ ├─ testOpenStaticScrolling2 ✔ │ ├─ testOpenStaticScrolling3 ✔ │ ├─ testOpenStaticScrolling4 ✔ │ ├─ testOpenStaticScrolling5 ✔ │ ├─ testOpenStaticScrolling6 ✔ │ ├─ testOpenStaticScrolling7 ✔ │ ├─ testOpenStaticScrolling8 ✔ │ ├─ testOpenStaticScrolling9 ✔ │ ├─ testOpenStaticScrolling10 ✔ │ ├─ testOpenStaticScrolling11 ✔ │ ├─ testOpenStaticScrolling12 ✔ │ ├─ testOpenStaticScrolling13 ✔ │ ├─ testOpenStaticScrolling14 ✔ │ ├─ testOpenStaticScrolling15 ✔ │ ├─ testOpenStaticScrolling16 ✔ │ ├─ testOpenStaticScrolling17 ✔ │ ├─ testOpenStaticScrolling18 ✔ │ ├─ testOpenStaticScrolling19 ✔ │ ├─ testOpenStaticScrolling20 ✔ │ ├─ testOpenStaticScrolling21 ✔ │ ├─ testOpenStaticScrolling22 ✔ │ ├─ testOpenStaticScrolling23 ✔ │ ├─ testOpenStaticScrolling24 ✔ │ ├─ testOpenStaticScrolling25 ✔ │ ├─ testOpenStaticScrolling26 ✔ │ ├─ testOpenStaticScrolling27 ✔ │ ├─ testOpenStaticScrolling28 ✔ │ ├─ testOpenStaticScrolling29 ✔ │ ├─ testOpenStaticScrolling30 ✔ │ ├─ testOpenStaticScrolling31 ✔ │ ├─ testOpenStaticScrolling32 ✔ │ ├─ testOpenStaticScrolling33 ✔ │ ├─ testOpenStaticScrolling34 ✔ │ ├─ testOpenStaticScrolling35 ✔ │ ├─ testOpenStaticScrolling36 ✔ │ ├─ testOpenStaticScrolling37 ✔ │ ├─ testOpenStaticScrolling38 ✔ │ ├─ testOpenStaticScrolling39 ✔ │ ├─ testOpenStaticScrolling40 ✔ │ ├─ testOpenStaticNonScrolling41 ✔ │ ├─ testOpenStaticNonScrolling42 ✔ │ ├─ testOpenStaticNonScrolling43 ✔ │ ├─ testOpenStaticNonScrolling44 ✔ │ ├─ testOpenStaticNonScrolling45 ✔ │ ├─ testOpenStaticNonScrolling46 ✔ │ ├─ testOpenStaticNonScrolling47 ✔ │ ├─ testOpenStaticNonScrolling48 ✔ │ ├─ testOpenStaticNonScrolling49 ✔ │ ├─ testOpenStaticNonScrolling50 ✔ │ ├─ testOpenStaticNonScrolling51 ✔ │ ├─ testOpenStaticNonScrolling52 ✔ │ ├─ testOpenStaticNonScrolling53 ✔ │ ├─ testOpenStaticNonScrolling54 ✔ │ ├─ testOpenStaticNonScrolling55 ✔ │ ├─ testOpenStaticNonScrolling56 ✔ │ ├─ testOpenStaticNonScrolling57 ✔ │ ├─ testOpenStaticNonScrolling58 ✔ │ ├─ testOpenStaticNonScrolling59 ✔ │ ├─ testOpenStaticNonScrolling60 ✔ │ ├─ testOpenStaticNonScrolling61 ✔ │ ├─ testOpenStaticNonScrolling62 ✔ │ ├─ testOpenStaticNonScrolling63 ✔ │ ├─ testOpenStaticNonScrolling64 ✔ │ ├─ testOpenStaticNonScrolling65 ✔ │ ├─ testOpenStaticNonScrolling66 ✔ │ ├─ testOpenStaticNonScrolling67 ✔ │ ├─ testOpenStaticNonScrolling68 ✔ │ ├─ testOpenStaticNonScrolling69 ✔ │ ├─ testOpenStaticNonScrolling70 ✔ │ ├─ testOpenStaticNonScrolling71 ✔ │ ├─ testOpenStaticNonScrolling72 ✔ │ ├─ testOpenStaticNonScrolling73 ✔ │ ├─ testOpenStaticNonScrolling74 ✔ │ ├─ testOpenStaticNonScrolling75 ✔ │ ├─ testOpenStaticNonScrolling76 ✔ │ ├─ testOpenStaticNonScrolling77 ✔ │ ├─ testOpenStaticNonScrolling78 ✔ │ ├─ testOpenStaticNonScrolling79 ✔ │ ├─ testOpenStaticNonScrolling80 ✔ │ ├─ testOpenDynamicScrolling1 ✔ │ ├─ testOpenDynamicScrolling2 ✔ │ ├─ testOpenDynamicScrolling3 ✔ │ ├─ testOpenDynamicScrolling4 ✔ │ ├─ testOpenDynamicScrolling5 ✔ │ ├─ testOpenDynamicScrolling6 ✔ │ ├─ testOpenDynamicScrolling7 ✔ │ ├─ testOpenDynamicScrolling8 ✔ │ ├─ testOpenDynamicScrolling9 ✔ │ ├─ testOpenDynamicScrolling10 ✔ │ ├─ testOpenDynamicScrolling11 ✔ │ ├─ testOpenDynamicScrolling12 ✔ │ ├─ testOpenDynamicScrolling13 ✔ │ ├─ testOpenDynamicScrolling14 ✔ │ ├─ testOpenDynamicScrolling15 ✔ │ ├─ testOpenDynamicScrolling16 ✔ │ ├─ testOpenDynamicScrolling17 ✔ │ ├─ testOpenDynamicScrolling18 ✔ │ ├─ testOpenDynamicScrolling19 ✔ │ ├─ testOpenDynamicScrolling20 ✔ │ ├─ testOpenDynamicScrolling21 ✔ │ ├─ testOpenDynamicScrolling22 ✔ │ ├─ testOpenDynamicScrolling23 ✔ │ ├─ testOpenDynamicScrolling24 ✔ │ ├─ testOpenDynamicScrolling25 ✔ │ ├─ testOpenDynamicScrolling26 ✔ │ ├─ testOpenDynamicScrolling27 ✔ │ ├─ testOpenDynamicScrolling28 ✔ │ ├─ testOpenDynamicScrolling29 ✔ │ ├─ testOpenDynamicScrolling30 ✔ │ ├─ testOpenDynamicScrolling31 ✔ │ ├─ testOpenDynamicScrolling32 ✔ │ ├─ testOpenDynamicScrolling33 ✔ │ ├─ testOpenDynamicScrolling34 ✔ │ ├─ testOpenDynamicScrolling35 ✔ │ ├─ testOpenDynamicScrolling36 ✔ │ ├─ testOpenDynamicScrolling37 ✔ │ ├─ testOpenDynamicScrolling38 ✔ │ ├─ testOpenDynamicScrolling39 ✔ │ ├─ testOpenDynamicScrolling40 ✔ │ ├─ testOpenDynamicNonScrolling41 ✔ │ ├─ testOpenDynamicNonScrolling42 ✔ │ ├─ testOpenDynamicNonScrolling43 ✔ │ ├─ testOpenDynamicNonScrolling44 ✔ │ ├─ testOpenDynamicNonScrolling45 ✔ │ ├─ testOpenDynamicNonScrolling46 ✔ │ ├─ testOpenDynamicNonScrolling47 ✔ │ ├─ testOpenDynamicNonScrolling48 ✔ │ ├─ testOpenDynamicNonScrolling49 ✔ │ ├─ testOpenDynamicNonScrolling50 ✔ │ ├─ testOpenDynamicNonScrolling51 ✔ │ ├─ testOpenDynamicNonScrolling52 ✔ │ ├─ testOpenDynamicNonScrolling53 ✔ │ ├─ testOpenDynamicNonScrolling54 ✔ │ ├─ testOpenDynamicNonScrolling55 ✔ │ ├─ testOpenDynamicNonScrolling56 ✔ │ ├─ testOpenDynamicNonScrolling57 ✔ │ ├─ testOpenDynamicNonScrolling58 ✔ │ ├─ testOpenDynamicNonScrolling59 ✔ │ ├─ testOpenDynamicNonScrolling60 ✔ │ ├─ testOpenDynamicNonScrolling61 ✔ │ ├─ testOpenDynamicNonScrolling62 ✔ │ ├─ testOpenDynamicNonScrolling63 ✔ │ ├─ testOpenDynamicNonScrolling64 ✔ │ ├─ testOpenDynamicNonScrolling65 ✔ │ ├─ testOpenDynamicNonScrolling66 ✔ │ ├─ testOpenDynamicNonScrolling67 ✔ │ ├─ testOpenDynamicNonScrolling68 ✔ │ ├─ testOpenDynamicNonScrolling69 ✔ │ ├─ testOpenDynamicNonScrolling70 ✔ │ ├─ testOpenDynamicNonScrolling71 ✔ │ ├─ testOpenDynamicNonScrolling72 ✔ │ ├─ testOpenDynamicNonScrolling73 ✔ │ ├─ testOpenDynamicNonScrolling74 ✔ │ ├─ testOpenDynamicNonScrolling75 ✔ │ ├─ testOpenDynamicNonScrolling76 ✔ │ ├─ testOpenDynamicNonScrolling77 ✔ │ ├─ testOpenDynamicNonScrolling78 ✔ │ ├─ testOpenDynamicNonScrolling79 ✔ │ └─ testOpenDynamicNonScrolling80 ✔ ├─ tests.persistence.word_index.TestContainsBooleanLogic ✔ │ ├─ testSingleTermRed ✔ │ ├─ testSingleTermGreen ✔ │ ├─ testSingleTermBlue ✔ │ ├─ testAndRedGreen ✔ │ ├─ testAndRedBlue ✔ │ ├─ testAndGreenBlue ✔ │ ├─ testAndThreeTerms ✔ │ ├─ testOrRedYellow ✔ │ ├─ testOrThreeTerms ✔ │ ├─ testGroupedOrAndBlue ✔ │ ├─ testRedAndGroupedOr ✔ │ ├─ testOrOfTwoConjunctions ✔ │ ├─ testAndNoMatch ✔ │ ├─ testOrYellowGreen ✔ │ ├─ testGroupedOrAndRed ✔ │ └─ testRepeatedTermInConjunction ✔ ├─ tests.persistence.word_index.TestContainsBufferCopy ✔ │ ├─ testBufferCopyPersistentTable ✔ │ └─ testBufferCopyTempTable ✔ └─ tests.persistence.word_index.TestContainsByBreakBy ✔ ├─ testContainsWithBy ✔ ├─ testContainsWithBreakBy ✔ ├─ testContainsJoinWithBy ✔ └─ testDynamicContainsWithBy ✔ Failures (10): FWD Test:tests.persistence.word_index.TestContainsIndexSelection:testNaturalOrderIsWordIndexNotRecno MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.TestContainsIndexSelection', methodName = 'testNaturalOrderIsWordIndexNotRecno', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: Expected: 2,4,5,3,1, but was: 1,2,3,4,5, com.goldencode.p2j.oo.core.AbstractAssert.raiseErrorForEquals(AbstractAssert.java:2182) com.goldencode.p2j.oo.core.AbstractAssert.call(AbstractAssert.java:1778) com.goldencode.p2j.oo.core.AbstractAssert.call(AbstractAssert.java:1762) com.goldencode.p2j.oo.core.AbstractAssert.call(AbstractAssert.java:2288) com.goldencode.p2j.oo.core.AbstractAssert.equalsImpl(AbstractAssert.java:1775) com.goldencode.p2j.oo.core.Assert.legacyEquals(Assert.java:2386) com.goldencode.testing.tests.persistence.word_index.TestContainsIndexSelection.testNaturalOrderIsWordIndexNotRecno(TestContainsIndexSelection.java:240) com.goldencode.testing.tests.persistence.word_index.TestContainsIndexSelection.testNaturalOrderIsWordIndexNotRecno(TestContainsIndexSelection.java:226) FWD Test:tests.persistence.word_index.ContainsCollationTest:accentedLettersAreWordCharactersAndFold MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.ContainsCollationTest', methodName = 'accentedLettersAreWordCharactersAndFold', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: 7 of 22 cases disagree for group [i18n] seq 5401-5499; 5401 [acute-spelling-finds-all-three] expected [1,2,3], got [1,3]; 5402 [plain-spelling-finds-all-three] expected [1,2,3], got [2]; 5403 [upper-spelling-finds-all-three] expected [1,2,3], got [1,3]; 5407 [diaeresis-folds-to-plain] expected [4], got []; 5415 [cedilla-folds-to-c] expected [6], got []; 5419 [umlaut-folds-to-a] expected [7], got []; 5421 [accented-and-folded-in-one-expression] expected [1,2,3], got [] com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.Assert.raiseError(Assert.java:5282) com.goldencode.testing.tests.persistence.word_index.ContainsCollationTest.assertNoMismatch(ContainsCollationTest.java:534) com.goldencode.testing.tests.persistence.word_index.ContainsCollationTest.assertNoMismatch(ContainsCollationTest.java:525) com.goldencode.testing.tests.persistence.word_index.ContainsCollationTest.accentedLettersAreWordCharactersAndFold(ContainsCollationTest.java:1643) com.goldencode.testing.tests.persistence.word_index.ContainsCollationTest.accentedLettersAreWordCharactersAndFold(ContainsCollationTest.java:1640) FWD Test:tests.persistence.word_index.ContainsErrorRejectionTest:queryTextDoesNotParseOverTempTables MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest', methodName = 'queryTextDoesNotParseOverTempTables', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: 4 of 4 cases disagree for query texts OpenEdge does not read as a query over temp-tables; 4108 [find-first] expected error 247, got error 7325 "QUERY-PREPARE text must have 1 FOR EACH/PRESELECT for each query buffer. (7325)"; 4109 [contains-with-no-operand] error 247 text expected "** Unable to understand after -- "WHERE ctbasic.txt". (247)", got "** Unable to understand after -- "CONTAINS". (247)"; 4110 [contains-twice] expected error 247, got error 3398 "CONTAINS allowed only for word indexed field references. (3398)"; 4111 [where-keyword-missing] expected error 247, got error 7328 " ctbasic txt must be a quoted constant or an unabbreviated, unambiguous buffer/field reference for buffers known to query . (7328)" com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.Assert.raiseError(Assert.java:5282) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.assertNoMismatch(ContainsErrorRejectionTest.java:613) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.assertNoMismatch(ContainsErrorRejectionTest.java:604) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.queryTextDoesNotParseOverTempTables(ContainsErrorRejectionTest.java:6358) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.queryTextDoesNotParseOverTempTables(ContainsErrorRejectionTest.java:6355) FWD Test:tests.persistence.word_index.ContainsErrorRejectionTest:queryTextDoesNotParseOverPermanentTables MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest', methodName = 'queryTextDoesNotParseOverPermanentTables', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: 3 of 4 cases disagree for query texts OpenEdge does not read as a query over permanent tables; 4108 [find-first] expected error 247, got error 7325 "QUERY-PREPARE text must have 1 FOR EACH/PRESELECT for each query buffer. (7325)"; 4110 [contains-twice] expected error 247, got error 3398 "CONTAINS allowed only for word indexed field references. (3398)"; 4111 [where-keyword-missing] expected error 247, got error 7328 " ctpbasic txt must be a quoted constant or an unabbreviated, unambiguous buffer/field reference for buffers known to query . (7328)" com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.Assert.raiseError(Assert.java:5282) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.assertNoMismatch(ContainsErrorRejectionTest.java:613) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.assertNoMismatch(ContainsErrorRejectionTest.java:604) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.queryTextDoesNotParseOverPermanentTables(ContainsErrorRejectionTest.java:6369) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.queryTextDoesNotParseOverPermanentTables(ContainsErrorRejectionTest.java:6366) FWD Test:tests.persistence.word_index.ContainsErrorRejectionTest:badOperandIsRejectedBeforeTheJoinOpens MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest', methodName = 'badOperandIsRejectedBeforeTheJoinOpens', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: a non-character operand in a join: expected prepare raised 223, query did not open, 0 rows, fetch raised nothing, got prepare accepted, query opened, 0 rows, fetch raised 223 com.goldencode.testing.support.test.AssertExt.equals_(AssertExt.java:1307) com.goldencode.testing.support.test.AssertExt.equals_(AssertExt.java:1293) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.badOperandIsRejectedBeforeTheJoinOpens(ContainsErrorRejectionTest.java:6794) com.goldencode.testing.tests.persistence.word_index.ContainsErrorRejectionTest.badOperandIsRejectedBeforeTheJoinOpens(ContainsErrorRejectionTest.java:6792) FWD Test:tests.persistence.word_index.ContainsLockModeTest:exclusiveLockOutsideAtransactionIsRefused MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest', methodName = 'exclusiveLockOutsideAtransactionIsRefused', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: 1 of 1 cases disagree for an EXCLUSIVE-LOCK CONTAINS query fetched outside a transaction; [exclusive-outside-transaction] expected error 2819, got no error com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.Assert.raiseError(Assert.java:5282) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.assertNoMismatch(ContainsLockModeTest.java:536) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.assertNoMismatch(ContainsLockModeTest.java:527) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.exclusiveLockOutsideAtransactionIsRefused(ContainsLockModeTest.java:781) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.exclusiveLockOutsideAtransactionIsRefused(ContainsLockModeTest.java:776) FWD Test:tests.persistence.word_index.ContainsLockModeTest:noWaitIsNotPartOfArecordPhrase MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest', methodName = 'noWaitIsNotPartOfArecordPhrase', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: 3 of 3 cases disagree for NO-WAIT appended to each lock mode of a CONTAINS query; [exclusive-no-wait] expected error 247, got no error; [share-no-wait] expected error 247, got no error; [no-lock-no-wait] expected error 247, got no error com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.Assert.raiseError(Assert.java:5282) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.assertNoMismatch(ContainsLockModeTest.java:536) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.assertNoMismatch(ContainsLockModeTest.java:527) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.noWaitIsNotPartOfArecordPhrase(ContainsLockModeTest.java:850) com.goldencode.testing.tests.persistence.word_index.ContainsLockModeTest.noWaitIsNotPartOfArecordPhrase(ContainsLockModeTest.java:841) FWD Test:tests.persistence.word_index.ContainsResultOrderTest:naturalOrderFollowsTheLeadingGroup MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.ContainsResultOrderTest', methodName = 'naturalOrderFollowsTheLeadingGroup', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: 4 of 4 cases disagree for the same expressions with no BY clause; [two-groups-forward] expected [1,3,2,4], got [1,2,3,4]; [two-groups-swapped] expected [1,4,2,3], got [1,2,3,4]; [three-way-forward] expected [7,10,8,12,9,11], got [7,8,9,10,11,12]; [three-way-swapped] expected [7,11,8,10,9,12], got [7,8,9,10,11,12] com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.Assert.raiseError(Assert.java:5282) com.goldencode.testing.tests.persistence.word_index.ContainsResultOrderTest.assertNoMismatch(ContainsResultOrderTest.java:537) com.goldencode.testing.tests.persistence.word_index.ContainsResultOrderTest.assertNoMismatch(ContainsResultOrderTest.java:528) com.goldencode.testing.tests.persistence.word_index.ContainsResultOrderTest.naturalOrderFollowsTheLeadingGroup(ContainsResultOrderTest.java:1419) com.goldencode.testing.tests.persistence.word_index.ContainsResultOrderTest.naturalOrderFollowsTheLeadingGroup(ContainsResultOrderTest.java:1408) FWD Test:tests.persistence.word_index.TestContains:testOffEnd1 MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.TestContains', methodName = 'testOffEnd1', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: Expected: TRUE but was: no com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.AbstractAssert.call(AbstractAssert.java:1762) com.goldencode.p2j.oo.core.Assert.call(Assert.java:5295) com.goldencode.p2j.oo.core.Assert.isTrue(Assert.java:1380) com.goldencode.testing.tests.persistence.word_index.TestContains.testOffEnd1(TestContains.java:1948) com.goldencode.testing.tests.persistence.word_index.TestContains.testOffEnd1(TestContains.java:1940) FWD Test:tests.persistence.word_index.TestContains:testOffEnd3 MethodSource [className = 'com.goldencode.testing.tests.persistence.word_index.TestContains', methodName = 'testOffEnd3', methodParameterTypes = ''] => org.opentest4j.AssertionFailedError: Expected: TRUE but was: no com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2216) com.goldencode.p2j.oo.core.AbstractAssert.raiseError(AbstractAssert.java:2205) com.goldencode.p2j.oo.core.AbstractAssert.call(AbstractAssert.java:1762) com.goldencode.p2j.oo.core.Assert.call(Assert.java:5295) com.goldencode.p2j.oo.core.Assert.isTrue(Assert.java:1380) com.goldencode.testing.tests.persistence.word_index.TestContains.testOffEnd3(TestContains.java:1985) com.goldencode.testing.tests.persistence.word_index.TestContains.testOffEnd3(TestContains.java:1977) Test run finished after 10773 ms [ 40 containers found ] [ 0 containers skipped ] [ 40 containers started ] [ 0 containers aborted ] [ 40 containers successful ] [ 0 containers failed ] [ 505 tests found ] [ 0 tests skipped ] [ 505 tests started ] [ 0 tests aborted ] [ 495 tests successful ] [ 10 tests failed ]