Title: DefaultConverter has many broken cases · Issue #450 · scijava/scijava-common · GitHub
Open Graph Title: DefaultConverter has many broken cases · Issue #450 · scijava/scijava-common
X Title: DefaultConverter has many broken cases · Issue #450 · scijava/scijava-common
Description: The DefaultConverter was not being tested directly. With 4e40e04, now it is. But there are many cases that do not work, marked with commented out tests. (Also many missing tests, but at least it's a start!) This issue exists to document ...
Open Graph Description: The DefaultConverter was not being tested directly. With 4e40e04, now it is. But there are many cases that do not work, marked with commented out tests. (Also many missing tests, but at least it's ...
X Description: The DefaultConverter was not being tested directly. With 4e40e04, now it is. But there are many cases that do not work, marked with commented out tests. (Also many missing tests, but at least it...
Opengraph URL: https://github.com/scijava/scijava-common/issues/450
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"DefaultConverter has many broken cases","articleBody":"The `DefaultConverter` was not being tested directly. With 4e40e04189cafcfad4c66357cbad17727dbf6325, now it is. But there are many cases that do not work, marked with commented out tests. (Also many missing tests, but at least it's a start!)\r\n\r\nThis issue exists to document some of the known problems, and thoughts on how best to resolve them.\r\n\r\nJust to give an inkling of the problems highlighted by this issue:\r\n```diff\r\n--- a/src/main/java/org/scijava/convert/DefaultConverter.java\r\n+++ b/src/main/java/org/scijava/convert/DefaultConverter.java\r\n@@ -73,6 +73,7 @@ public class DefaultConverter extends AbstractConverter\u003cObject, Object\u003e {\r\n \r\n @Override\r\n public Object convert(final Object src, final Type dest) {\r\n+ if (!canConvert(src, dest)) return null;\r\n \r\n // Handle array types, including generic array types.\r\n final Type componentType = Types.component(dest);\r\n@@ -92,6 +93,8 @@ public class DefaultConverter extends AbstractConverter\u003cObject, Object\u003e {\r\n \r\n @Override\r\n public \u003cT\u003e T convert(final Object src, final Class\u003cT\u003e dest) {\r\n+ if (!canConvert(src, dest)) return null;\r\n+\r\n // ensure type is well-behaved, rather than a primitive type\r\n final Class\u003cT\u003e saneDest = Types.box(dest);\r\n```\r\n:point_up: This patch breaks three tests. :open_mouth: \r\n\r\nSo let's consider the following questions:\r\n\r\nWhat would you expect to happen in the following circumstances? You ask SciJava Common to convert some data you have, to a particular type:\r\n\r\n1. `\"{{0, 1}, {2, 3}}\"` \u0026rarr; `double[][]`. Do you expect: A) `[[0d, 1d], [2d, 3d]]`? B) `null`?\r\n2. `\"{{0, 1}, {curtis, 3}}\"` \u0026rarr; `Double[][]`. Do you expect: A) `[[0d, 1d], [null, 3d]]`? B) `null`?\r\n3. `\"{{0, 1}, {curtis, 3}}\"` \u0026rarr; `double[][]`. Do you expect: A) `[[0d, 1d], [NaN, 3d]]`? B) `null`?\r\n4. `\"5\"` \u0026rarr; `double[]`. Do you expect: A) `[5d]`? B) `null`?\r\n5. `\"5\"` \u0026rarr; `double[][]`. Do you expect: A) `[[5d]]`? B) `null`?\r\n6. `\"curtis\"` \u0026rarr; `double[]`. Do you expect: A) `[NaN]`? B) `null`?\r\n7. `\"curtis\"` \u0026rarr; `Double[]`. Do you expect: A) `[null]`? B) `null`?\r\n8. `\"curtis\"` \u0026rarr; `Double[][]`. Do you expect: A) `[[null]]`? B) `null`?\r\n\r\nI think the following behavior is what we should shoot for:\r\n\r\n* When converting to an array/collection type, we first go to `Object[]`, `Object[][]`, etc., of correct dimensionality.\r\n* If dimensionality of this initially converted source is less than dimensionality of target, we wrap it in extra dimensions till it's the same.\r\n* If dimensionality of the initially converted source is *more* than the dimensionality of target, return `null`.\r\n* Otherwise: we allocate the destination object of the requested type, then convert source's leaf elements one by one to destination elements.\r\n\r\nE.g. for (8) above, we would go `\"curtis\"` \u0026rarr; `new Object[][] {{\"curtis\"}}` \u0026rarr; `new Double[][] {{ convert(\"curtis\", Double.class) }}`.\r\n\r\nThe remaining question is: what to do if any/all of those leaves are not convertible?\r\n\r\nAfter some discussion between myself, @hinerm, and @gselzer, we narrowed down the following potentially reasonable behavior:\r\n\r\n1. If *all* of the leaf elements are convertible to the destination element type, then the converted object is populated. Otherwise, the *whole collection* is inconvertible, and we return `null` for the whole collection, and `false` for `canConvert`. This would answer the above list with `null` for questions 2, 3, 6, 7, 8.\r\n\r\n2. If *any* of the leaf elements are convertible to the destination element type, then the converted object is populated, filling any inconvertible elements with `null`. This would answer the above list with `null` for questions 6, 7, 8—but 2 and 3 would work.\r\n\r\n3. *Regardless* of whether any leaf elements are convertible to the destination element type, the converted object is populated, filling nulls as in (2). This would answer the above list with \"As all the way down\" i.e. no `null` results.\r\n\r\nPart of this issue is deciding which of these three behaviors would be best. Then fixing the `DefaultConverter` to work that way—in both its `canConvert` and `convert` methods—and uncommenting the disabled tests (and adjusting them as needed) to validate it.","author":{"url":"https://github.com/ctrueden","@type":"Person","name":"ctrueden"},"datePublished":"2023-02-01T21:19:56.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/450/scijava-common/issues/450"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:daeb18bd-71ef-e577-40d7-48331b1b741a |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | A22C:6F200:C07D24:1088998:6969F47C |
| html-safe-nonce | a0480f90b1ccb2092d6d7f11bc45d4cdf6e528e289f7422b3c2de809e2ec986e |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBMjJDOjZGMjAwOkMwN0QyNDoxMDg4OTk4OjY5NjlGNDdDIiwidmlzaXRvcl9pZCI6IjI4MDUwODc0MTEwMTQwNzE0MjAiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 1fdf9b6e45d29905c9f6bd7698bd3bd933355a532ac472319598628bfd67127b |
| hovercard-subject-tag | issue:1566849210 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/scijava/scijava-common/450/issue_layout |
| twitter:image | https://opengraph.githubassets.com/fde9bce670449722e2790445c455ac448d77c16595cbdfd4e1aa92f5160ebee2/scijava/scijava-common/issues/450 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/fde9bce670449722e2790445c455ac448d77c16595cbdfd4e1aa92f5160ebee2/scijava/scijava-common/issues/450 |
| og:image:alt | The DefaultConverter was not being tested directly. With 4e40e04, now it is. But there are many cases that do not work, marked with commented out tests. (Also many missing tests, but at least it's ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | ctrueden |
| hostname | github.com |
| expected-hostname | github.com |
| None | 7b32f1c7c4549428ee399213e8345494fc55b5637195d3fc5f493657579235e8 |
| turbo-cache-control | no-preview |
| go-import | github.com/scijava/scijava-common git https://github.com/scijava/scijava-common.git |
| octolytics-dimension-user_id | 1262770 |
| octolytics-dimension-user_login | scijava |
| octolytics-dimension-repository_id | 3594497 |
| octolytics-dimension-repository_nwo | scijava/scijava-common |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 3594497 |
| octolytics-dimension-repository_network_root_nwo | scijava/scijava-common |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | bdde15ad1b403e23b08bbd89b53fbe6bdf688cad |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width