Почему я получаю ошибку при выполнении теста eunit? - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок в erlang и во время обучения пытался проверить код, написанный для калькулятора обратной польской нотацииЯ сохранил тестовую функцию, записанную в тестовом файле, и затем, используя команду "eunit: test (calc1, [verbose)], я получаю ошибку.

однако, если я сохранил исходный код и тестовую функциюв том же модуле ... все работает нормально .... Пожалуйста, помогите мне понять ошибку и как ее устранить.

Может быть, поправьте меня, если я делаю что-то не так.

Исходный кодмодуль для вычисления RPN:

-module(calc1).

-export([calc/1]).

calc(L) when is_list(L) -> 

    [Result] = lists:foldl(fun calc/2, [], string:tokens(L," ")),

    Result.

calc("+", [N1,N2|Stack]) -> [N2+N1|Stack];

calc("-", [N1,N2|Stack]) -> [N2-N1|Stack];

calc("*", [N1,N2|Stack]) -> [N2*N1|Stack];

calc("/", [N1,N2|Stack]) -> [N2/N1|Stack];

calc("^", [N1,N2|Stack]) -> [math:pow(N2,N1)|Stack];

calc("ln", [N|Stack])    -> [math:log(N)|Stack];

calc("log10", [N|Stack]) -> [math:log10(N)|Stack];

calc("sum", Stack)   -> [lists:sum(Stack)];

calc("prod", Stack)  -> [lists:foldl(fun erlang:'*'/2, 1, Stack)];

calc(X, [Stack]) -> [read(X)|Stack].

%% read(String()) -> Int() | Float()

read(X) ->

    case string:to_float(X) of

        {error, no_float} -> list_to_integer(X);

        {F,_} -> F

    end.

код тестового файла:

-module(calc1_tests).

-include_lib("eunit/include/eunit.hrl").

calc_test() ->
    87 = calc1:calc("90 3 -").

Предполагается, что тестовый пример пройден, но я получаю ошибку.

10> c(calc1).
{ok,calc1}

11> c(calc1_tests). 

{ok,calc1_tests}

12> eunit:test(calc1).

calc1_tests: calc1_test (module 'calc1_tests')...*failed*

in function calc1:calc/2 (calc1.erl, line 22)

  called as calc("90",[])

in call from lists:foldl/3 (lists.erl, line 1263)

in call from calc1:calc/1 (calc1.erl, line 19)

in call from calc1_tests:calc_test/0 (calc1_tests.erl, line 6)

in call from eunit_test:'-mf_wrapper/2-fun-0-'/2 (eunit_test.erl, line 273)

in call from eunit_test:run_testfun/1 (eunit_test.erl, line 71)

in call from eunit_proc:run_test/1 (eunit_proc.erl, line 510)

in call from eunit_proc:with_timeout/3 (eunit_proc.erl, line 335)

**error:function_clause

  output:<<"">>

1 Ответ

0 голосов
/ 19 декабря 2018

Это функциональное предложение неверно:

calc(X, [Stack]) -> [read(X)|Stack].

Вы пытаетесь сопоставить список, содержащий один элемент, но к тому времени, как вы доберетесь до конца RPN, вы фактически получитепустой список (стек).Вероятно, должно быть calc(X, Stack) -> ...

...