-module(string_builder_test). -compile(no_auto_import). -export([using_compose_test/0, shortform_test/0, end0_test/0, end1_test/0, end2_test/0, end3_test/0, custom_formatter_test/0, int_list_test/0, arg_int_list_test/0]). using_compose_test() -> Formatter = string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:compose( string_builder:string_formatter( <<"My name "/utf8>> ), string_builder:string_formatter( <<"is "/utf8>> ) ), fun string_builder:arg_string_formatter/1 ), string_builder:string_formatter( <<" and I have "/utf8>> ) ), fun string_builder:arg_int_formatter/1 ), string_builder:string_formatter( <<" "/utf8>> ) ), fun string_builder:arg_string_formatter/1 ), string_builder:string_formatter(<<", "/utf8>>) ), fun string_builder:arg_int_formatter/1 ), string_builder:string_formatter(<<" "/utf8>>) ), fun string_builder:arg_string_formatter/1 ), string_builder:string_formatter(<<" and "/utf8>>) ), string_builder:int_formatter(1) ), string_builder:string_formatter(<<" snake!"/utf8>>) ), gleam@should:equal( (((((Formatter(fun string_builder:identity/1))(<<"Sally"/utf8>>))(3))( <<"dogs"/utf8>> ))(2))(<<"cats"/utf8>>), <<"My name is Sally and I have 3 dogs, 2 cats and 1 snake!"/utf8>> ). shortform_test() -> Formatter = string_builder:string( string_builder:int( string_builder:string( string_builder:arg_string( string_builder:string( string_builder:arg_int( string_builder:string( string_builder:arg_string( string_builder:string( string_builder:arg_int( string_builder:string( string_builder:arg_string( string_builder:string( string_builder:string( fun string_builder:new/1, <<"My name "/utf8>> ), <<"is "/utf8>> ) ), <<" and I have "/utf8>> ) ), <<" "/utf8>> ) ), <<", "/utf8>> ) ), <<" "/utf8>> ) ), <<" and "/utf8>> ), 1 ), <<" snake!"/utf8>> ), gleam@should:equal( (((((Formatter(fun string_builder:identity/1))(<<"Sally"/utf8>>))(3))( <<"dogs"/utf8>> ))(2))(<<"cats"/utf8>>), <<"My name is Sally and I have 3 dogs, 2 cats and 1 snake!"/utf8>> ). end0_test() -> Formatter = string_builder:end0( string_builder:string( string_builder:string( fun string_builder:new/1, <<"My name is "/utf8>> ), <<"Sally."/utf8>> ) ), gleam@should:equal(Formatter(), <<"My name is Sally."/utf8>>). end1_test() -> Formatter = string_builder:end1( string_builder:string( string_builder:arg_string( string_builder:string( fun string_builder:new/1, <<"My name is "/utf8>> ) ), <<"."/utf8>> ) ), gleam@should:equal( Formatter(<<"Sally"/utf8>>), <<"My name is Sally."/utf8>> ). end2_test() -> Formatter = string_builder:end2( string_builder:string( string_builder:arg_int( string_builder:string( string_builder:arg_string( string_builder:string( fun string_builder:new/1, <<"My name is "/utf8>> ) ), <<" and I'm "/utf8>> ) ), <<" years old."/utf8>> ) ), gleam@should:equal( Formatter(<<"Sally"/utf8>>, 20), <<"My name is Sally and I'm 20 years old."/utf8>> ). end3_test() -> Formatter = string_builder:end3( string_builder:string( string_builder:arg_int( string_builder:string( string_builder:arg_int( string_builder:string( string_builder:arg_string(fun string_builder:new/1), <<" has "/utf8>> ) ), <<" dogs and "/utf8>> ) ), <<" cats."/utf8>> ) ), gleam@should:equal( Formatter(<<"Sam"/utf8>>, 2, 3), <<"Sam has 2 dogs and 3 cats."/utf8>> ). state_to_string(State) -> case State of pending -> <<"pending"/utf8>>; done -> <<"done"/utf8>> end. custom_formatter_test() -> CustomStateFormatter = fun(Callback) -> fun(Input) -> Callback(state_to_string(Input)) end end, Formatter = string_builder:end1( string_builder:string( string_builder:compose( string_builder:string( fun string_builder:new/1, <<"The current state is "/utf8>> ), CustomStateFormatter ), <<"!"/utf8>> ) ), gleam@should:equal(Formatter(done), <<"The current state is done!"/utf8>>). int_list_test() -> Formatter = string_builder:end0( string_builder:int_list( string_builder:string( fun string_builder:new/1, <<"The winners are "/utf8>> ), [1, 2, 3] ) ), gleam@should:equal(Formatter(), <<"The winners are 1, 2, 3"/utf8>>). arg_int_list_test() -> Formatter = string_builder:end1( string_builder:arg_int_list( string_builder:string( fun string_builder:new/1, <<"The winners are "/utf8>> ) ) ), gleam@should:equal(Formatter([1, 2, 3]), <<"The winners are 1, 2, 3"/utf8>>).