Thanks, that solved my specific issue. I still think that some improvements 
are needed.

Looking at the code for CaptureIO, I think those changes should be made 
directly in the StringIO / IO modules and not specifically for CaptureIO.

The following things are not great today IMHO:

   1. The encoding that lets everything through is called latin1. I think 
   we should introduce & properly document a new encoding called something 
   like raw_binary. It would work exactly the same though.
   2. IO.write with invalid characters into an io device with any encoding 
   should have a better error message. (Something like "<<222>> is not a valid 
   unicode string. Provide `encoding: :raw_binary` when opening the io device")
   3. IO.binwrite with invalid characters into an encoding: :unicode io 
   device should probably at least warn if invalid characters are passed.

This would something like this in the form of a 
test: https://gist.github.com/maennchen/f428360a71d23a323538d9b7d51e638b

On Wednesday, April 6, 2022 at 9:29:12 PM UTC+2 Wojtek Mach wrote:

> > Additionally, it would be good if there was a proper error for invalid 
> characters instead of the currently raised ArgumentError.
>
> Yeah the error is pretty bad:
>
> IO.puts(<<222>>)
> ** (ArgumentError) errors were found at the given arguments: unknown error: 
> put_chars
>
>
> It is slightly more informative when used inside capture io though:
>
>     assert capture_io(fn ->
>              IO.puts(<<222>>)
>            end) == <<222>>
> ** (ArgumentError) errors were found at the given arguments: unknown error: 
> {put_chars,unicode,[<<"Þ">>,10]}
>
>
> We get error because stdio is with unicode encoding:
>
> iex> :io.getopts(:standard_io)[:encoding]
> :unicode
>
>
> and we're writing <<222>> which isn't unicode.
>
> For writing in raw mode, use IO.binwrite. This and the previously 
> mentioned :encoding option will make the following test succeed:
>
>     assert capture_io([encoding: :latin1], fn ->
>              IO.binwrite(<<222>>)
>            end) == <<222>>
>
>
> On April 6, 2022, "maennchen.ch" <jon...@maennchen.ch> wrote:
>
> That unfortunately gives me the same result.
>
> On Wednesday, April 6, 2022 at 6:57:35 PM UTC+1 Wojtek Mach wrote:
>>
>> I believe capture_io(encoding: :latin1, fun) should do the trick, can you 
>> check?
>>
>> On April 6, 2022, "maennchen.ch" <jon...@maennchen.ch> wrote:
>>
>> Hi everyone,
>>
>> *Background*
>>
>> While developing tests for a mix task, that returns non UTF8 binaries 
>> into STDOUT (building block to be piped into a file / pipe), I found that 
>> ExUnit.CaptureIO can only handle UTF8 and Latin1.
>>
>> Example Test that does not work:
>> https://gist.github.com/maennchen/16d411eeda3255fa3d3152fe9d836a82
>>
>> *Proposal*
>>
>> For testing this use case, it would be good if any raw binary would also 
>> be passed through. (Maybe via option "encoding: :raw_binary")
>>
>> Additionally, it would be good if there was a proper error for invalid 
>> characters instead of the currently raised ArgumentError.
>>
>> *Real World Example*
>>
>> Here is a real test, that would be made possible by this change: 
>> https://github.com/elixir-gettext/expo/blob/9048fe242830614f6d4235cbd345de844693f28a/test/mix/tasks/expo.msgfmt_test.exs#L18
>>
>> *PR*
>>
>> I'm happy to provide a PR for this as well.
>>
>> Thanks & Kind Regards,
>> Jonatan
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-co...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/e35e97cf-00d6-422e-b3c1-ec508ff1e36fn%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/e35e97cf-00d6-422e-b3c1-ec508ff1e36fn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to elixir-lang-co...@googlegroups.com.
>
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/elixir-lang-core/9e817fc9-6f61-4476-bb27-c062ed6167fan%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/elixir-lang-core/9e817fc9-6f61-4476-bb27-c062ed6167fan%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/f2816480-4d91-4576-9241-3bdc9351a920n%40googlegroups.com.

Reply via email to