2015-05-03 9:06 GMT+03:00 Olaf Dabrunz <[email protected]>: > On 02-May-15, Nikolay Pavlov wrote: >> 2015-05-02 5:44 GMT+03:00 Olaf Dabrunz <[email protected]>: >> > On 30-Apr-15, Nikolay Pavlov wrote: >> >> 2015-04-30 10:56 GMT+03:00 Olaf Dabrunz <[email protected]>: >> >> > diff -r 18d84ed365a5 src/testdir/test55.in >> >> > --- a/src/testdir/test55.in Wed Apr 22 22:18:22 2015 +0200 >> >> > +++ b/src/testdir/test55.in Thu Apr 30 09:09:37 2015 +0200 >> >> > @@ -408,6 +408,20 @@ let l = [0, 1, 2, 3] >> >> > :endtry >> >> > :$put =string(d) >> >> > :" >> >> > +:$put ='extend() after lock on dict (existing: yes, new: no):' >> >> > +:unlet! d >> >> > +:let d = {'a': 99, 'b': 100} >> >> > +:lockvar 1 d >> >> > +:try >> >> > +: $put =string(extend(d, {'a': 123})) >> >> > +: $put ='did extend() existing item' >> >> >> >> I think :try should be here, not above. >> > >> > The :try block fails on the first extend() without the patch, and on the >> > second one (as intended) with the patch. This tests for regressions. >> > >> > What would be achieved by moving the :try here? >> >> With `:try` block moved it will run both extend()s always. Test will >> fail in any case: without move because of absense of two put lines and >> also different dictionary value, with move because of wrong put output >> when stringifying dictionary later and put=string(extend(...)) output >> (with the error, but without :try it will put zero). By moving try you >> show *where you expect* the exception. > > Ah, this is also a pattern to mark the expected error for the reader. > > ( > In the meantime, the next iterations of this test marked the > expected passing test with 'ok:' and the expected error with > 'wrong:' in the messages following each of them. > > But my marks only work well when the 'ok' tests precede the 'wrong' > tests, and all are executed in a :try block. Yet, in a list of > tests in the same :try block, if an early 'ok' test fails, all > following tests won't be done, test coverage is reduced, and > valuable information about test outcomes is missing from error > reports. > ) > > Now I see: the most succinct way with full coverage is to do tests that > are expected to pass outside of a :try block and without a following > message, and tests that are expected to fail inside a :try block for > each of them. > > Thanks! > > I just changed this test for the next patch round. > >> >> > +: $put =string(extend(d, {'x': 'new'})) >> >> > +: $put ='did extend() with new item' >> >> > +:catch >> >> > +: $put =v:exception[:14] >> >> > +:endtry >> >> > +:$put =string(d) >> >> > +:" >> >> >> >> Here some crucial tests are missing: >> >> >> >> 1. `extend(d, {'a': 456, 'x': 'new'})` without try/catch. >> >> 2. Same in a try/catch. >> >> 3. Both repeated with a second argument to `extend` where `keys(arg)` >> >> returns `[old_key1, new_key2, old_key3]` (this is needed to make sure >> >> that all old keys are modified). >> >> >> >> Unless it is possible for `extend` to modify *all* old keys regardless >> >> the internal order I would prefer the current behaviour where you at >> >> least always know that nothing will be modified. >> > >> > I sent a new patch (in a different mail) that changes all of the >> > pre-existing and added error-on-exit behavior into all-or-nothing >> > behavior, except for the out of memory case (which remains unchanged at >> > continue-on-error). Please see my comments and the patch there. >> > >> > The patch includes a new test for all-or-nothing semantics, as you >> > described in 3. above. >> > >> > Could you explain what tests 1. and 2. are meant to test? >> >> If you were going to use not all-or-nothing, but continue-on-error >> they were testing how you continue on error specifically (that you do >> this regardless of :try). > > I see. > > Please note that my original patch did not change the error handling > mode, and was not intended to. That is why the purpose of these tests > did not become clear without explanation. > > But the error handling mode of course is a matter of concern, as the > patch introduces a new error condition that is potentially more likely > to trigger in production code, *if* someone uses user locks in > production code (which I still have difficulties to imagine), rather > than for debugging. > > A test like this for continue-on-error behavior is now in the next > version of the 'RFC' variant of the patch. > >> [...] >> >> Test should also test the order of the `keys()` output to make sure >> >> that it will be modified once changes that affect internal hash >> >> ordering are pushed. >> > >> > For the change on extend() locks, what would testing for changes in hash >> > ordering achieve? >> >> That if you have continue-on-error you *do* have continue-on-error. >> Tests for changes in hash ordering are needed to check that test is >> testing what it was expected to test: [existing, new, existing] in a >> second dictionary makes sure that both existing keys are modified even >> if error occures in between. If you do not check the ordering you >> cannot know whether you are testing [existing, new, existing] or >> [existing, existing, new] (which is useless because it will emit the >> same result for both continue-on-error and exit-on-error). > > Thanks! > > In the meantime, I more or less got what you meant, and updated the > patch. > > It is good to test this explicitly, so that this property cannot be > overlooked, even though a hash ordering change is likely to be noticed > anyway: hash items are printed or stringified in hash order, so that > probably all tests that print dictionaries need to be updated then.
This is why I actually use either single-item dictionaries or `string(sort(items(dictionary)))` to stringify dictionary when I need this. > >> > We know that extend()'s current exit-on-error behavior depends on hash >> > ordering. Of course, when the hash ordering changes, the item that >> > causes an exit-on-error may come sooner or later. But this is not a >> > regression. >> >> It is a regression *of the test itself*, not the regression in the code. >> >> If you prefer exit-on-error like it is currently doing [existing, new, >> existing] will fail if behaviour will change compared to both >> continue-on-error and all-or-nothing. [new, existing, existing] does >> not allow to distinguish all-or-nothing and exit-on-error. [existing, >> existing, new] does not allow to distinguish exit-on-error and >> continue-on-error. So you need to check the ordering to make sure your >> test is testing what it is expected to test. >> >> In the test in the next message you should check that 'c' is both not >> the first and not the last key, not just not the first. > > Yes, with the attention that error handling modes get, we should test > that they work as intended, and consequently also that the tests work as > intended. > > An updated test is now in the next version of the 'RFC' variant of the > patch. > > -- > Olaf Dabrunz (oda <at> fctrace.org) > > -- > -- > You received this message from the "vim_dev" maillist. > Do not top-post! Type your reply below the text you are replying to. > For more information, visit http://www.vim.org/maillist.php > > --- > You received this message because you are subscribed to the Google Groups > "vim_dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
