Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Capture_io can has mock input and ExUnit.Server stops when getting :eof as an input #1103

Merged
merged 2 commits into from
May 22, 2013

Conversation

mururu
Copy link
Contributor

@mururu mururu commented May 22, 2013

discussing at #919

Using this patch, we can test IEx like the following.

ExUnit.start []

defmodule IEx.InteractiveTest do
  use ExUnit.Case, async: true

  import ExUnit.CaptureIO

  setup_all do
    :application.start(:iex)
  end

  setup do
    scope = :elixir.scope_for_eval(
      file: "iex",
      delegate_locals_to: IEx.Helpers
    )

    config=IEx.Config[
      binding: [],
      scope: scope,
    ]

    { :ok, config: config }
  end


  test "iex", context do
    input  = %B"""
             a = 2
             a + 3
             """
    expect = %B"""
             2
             5
             """

    assert capture_io(input, fn ->
      IEx.Server.start(context[:config])
    end) |> strip == expect
  end

  test "#iex:break", context do
    input = %B"""
            "a
            #iex:break
            """

    output = capture_io(input, fn ->
      IEx.Server.start(context[:config])
    end) |> strip

    assert output =~ %r/TokenMissingError/
    assert output =~ %r/incomplete expression/
  end


  defp strip(output) do
    output |> String.split("\n") |> tl |> Enum.join("\n")
  end
end

@josevalim
Copy link
Member

This is awesome! ❤️ 💚 💙 💛 💜

@@ -28,7 +28,8 @@ defmodule ExUnit.CaptureIO do
named device like `:stderr` is also possible globally by
giving the registered device name explicitly as argument.

The input is mocked to return `:eof`.
A developer can set a string as an input. The default
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we make the default input to be an empty string? If we have an empty string, it means we also reached the end of the file...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we do it, we can force the input to always be a binary!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@josevalim Empty string doesn't mean the end of input in general. If you're going to use capture_io for anything other than iex, it'll might not behave well.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems the code treat them as the same though, no?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the difficult point is IO includes various IO. When a developer deal with standard IO(a keyboard and a display), he don't have to necessarily consider :eof, but when he deal with file IO, he have to consider :eof.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perfect. :) Ok! let me know when we can merge this! :D

@mururu
Copy link
Contributor Author

mururu commented May 22, 2013

I fixed typo. Please merge this.

josevalim pushed a commit that referenced this pull request May 22, 2013
Capture_io can has mock input and ExUnit.Server stops when getting :eof as an input
@josevalim josevalim merged commit 1ef67c5 into elixir-lang:master May 22, 2013
@josevalim
Copy link
Member

Merged (with pleasure)!

@mururu
Copy link
Contributor Author

mururu commented May 22, 2013

Thanks! :D

@mururu mururu deleted the iex-test branch May 22, 2013 17:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

3 participants