Merge branch 'master' into jonte_rewrite

Conflicts:
	src/ggs_coordinator.erl
	src/ggs_gamevm_e.erl
	src/ggs_table.erl
This commit is contained in:
Jonatan Pålsson 2011-02-24 11:38:36 +01:00
commit 97c7e39b4a
23 changed files with 306 additions and 272 deletions

View file

@ -91,7 +91,6 @@ handle_cast({stop, _Reason}, State) ->
%% @TODO: Implement me
%handle_cast({remove_player, Player}) ->
% {noreply, State#co_state{
handle_cast(_Message, State) ->
{noreply, State}.

91
src/ggs_db.erl Normal file
View file

@ -0,0 +1,91 @@
%%%%----------------------------------------------------
%%% @author Mattias Pettersson <mattiaspgames@gmail.com>
%%% @copyright 2011 Mattias Pettersson
%%% @doc Database for runtime game variable storage.
%%% @end
-module(ggs_db).
-export([init/0,stop/0,setItem/4,getItem/3,removeItem/3,key/3,clear/2,clear/1,length/2]).
%-include("ggs_db.hrl").
-record(data, {key, value}).
%%-----------------------------------------------------
%% Creation
%%-----------------------------------------------------
init() ->
% mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(data, [{attributes, record_info(fields, data)}]).
stop() ->
mnesia:stop().
%%-----------------------------------------------------
%% Insertions
%%-----------------------------------------------------
setItem(GameToken,Ns,Key,Value) ->
Fun = fun() ->
Data = #data{key = {GameToken,Ns,Key}, value = Value},
mnesia:write(Data)
end,
mnesia:transaction(Fun).
%%-----------------------------------------------------
%% Deletions
%%-----------------------------------------------------
removeItem(GameToken,Ns,Key) ->
Fun = fun() ->
mnesia:delete({data,{GameToken,Ns,Key}})
end,
mnesia:transaction(Fun).
clear(GameToken,Ns) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys),
lists:map(fun({A,B,C}) -> removeItem(A,B,C) end, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
clear(GameToken) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,_,_}) -> (A==GameToken) end, Keys),
lists:map(fun({A,B,C}) -> removeItem(A,B,C) end, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
%%-----------------------------------------------------
%% Queries
%%-----------------------------------------------------
getItem(GameToken,Ns,Key) ->
Fun = fun() ->
mnesia:read(data, {GameToken,Ns,Key})
end,
case mnesia:transaction(Fun) of
{atomic, []} ->
{error};
{atomic, [Ret]} ->
Ret#data.value
end.
length(GameToken,Ns) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
length(lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys))
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
key(GameToken,Ns,Position) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys),
lists:nth(Position, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.

5
src/ggs_db.hrl Normal file
View file

@ -0,0 +1,5 @@
%% gamedb.hrl
-record(data, {key, value}).

View file

@ -97,34 +97,3 @@ code_change(_OldVsn, State, _Extra) ->
js_escape(S) ->
lists:flatmap(fun($\') -> [$\\, $\']; (X) -> [X] end, S).
%% ----------------------------------------------------------------------
% Tests
start_link_test() ->
erlang_js:start(), %% @TODO: should only be done once
GameVM = start_link(test_table),
?assertNot(GameVM =:= undefined).
define_test() ->
GameVM = start_link(test_table),
define(GameVM, "function hello(test) { return test; }"),
?assertMatch(<<"jeena">>, gen_server:call(GameVM, {eval, "hello('jeena')"})).
stop_test() ->
GameVM = start_link(test_table),
ok = stop(GameVM).
user_command_test() ->
GameVM = start_link(test_table),
define(GameVM, "var t = '';\nfunction userCommand(user, command, args) { t = user + command + args; }\n"),
user_command(GameVM, "'jeena", "thecommand", "theargs'"),
?assertMatch(<<"'jeenathecommandtheargs'">>, gen_server:call(GameVM, {eval, "t;"})).
js_erlang_test() ->
GameVM = start_link(test_table),
define(GameVM, "var t = '';\nfunction userCommand(user, command, args) { t = callErlang('erlang time') + ''; }\n"),
user_command(GameVM, "", "", ""),
{A, B, C} = erlang:time(),
T = "{" ++ integer_to_list(A) ++ ", " ++ integer_to_list(B) ++ ", " ++ integer_to_list(C) ++ "}",
?assertMatch(T, binary_to_list(gen_server:call(GameVM, {eval, "t;"}))).

View file

@ -12,12 +12,13 @@
%% API
-export([start_link/0,
add_player/2,
remove_player/2,
stop/1,
notify/3]).
add_player/2,
remove_player/2,
stop/1,
notify/3,
notify_all_players/2,
notify_game/3]).
-include_lib("eunit/include/eunit.hrl").
%% ----------------------------------------------------------------------
% API implementation
@ -25,6 +26,7 @@
% @doc returns a new table
start_link() ->
{ok, Pid} = gen_server:start_link(?MODULE, [], []),
Pid.
%% @private
call(Pid, Msg) ->
@ -96,9 +98,10 @@ handle_cast({notify_game, Message, From}, #state { game_vm = GameVM } = State) -
{noreply, State};
handle_cast({notify_all_players, Message}, #state{players = Players} = State) ->
lists:foreach(fun(P) ->
ggs_player:notify(P, "Server", Message)
end, Players),
lists:foreach(
fun(P) -> ggs_player:notify(P, "Server", Message) end,
Players
),
{noreply, State};
handle_cast(stop, State) ->
@ -120,80 +123,3 @@ terminate(_Reason, _State) ->
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%% @TODO: Please put these tests in a separate file. We can't compile this file if
%% they contain errors from switching vms
%% ----------------------------------------------------------------------
% Tests
%<<<<<<< HEAD
%start_link_test() ->
% Table = start_link(),
% ?assertNot(Table =:= undefined).
%add_player_test() ->
% Table = start_link(),
% Player = test_player,
% add_player(Table, Player),
% {ok, [Player]} = gen_server:call(Table, get_player_list).
%remove_player_test() ->
% Table = start_link(),
% Player = test_player,
% Player2 = test_player2,
% add_player(Table, Player),
% {ok, [Player]} = gen_server:call(Table, get_player_list),
% add_player(Table, Player2),
% {ok, [Player2, Player]} = gen_server:call(Table, get_player_list),
% remove_player(Table, Player),
% {ok, [Player2]} = gen_server:call(Table, get_player_list),
% remove_player(Table, Player2),
% {ok, []} = gen_server:call(Table, get_player_list).
%
%stop_test() ->
% Table = start_link(),
% ok = stop(Table).
% @private
%notify_test() ->
% Table = start_link(),
% Player = test_player,
% Message = {server, define, "function helloWorld(x) { }"},
% ok = notify(Table, Player, Message).
%=======
%%start_link_test() ->
% Table = start_link("123", none),
% ?assertNot(Table =:= undefined).
%
%add_player_test() ->
% Table = start_link("123", none),
% Player = test_player,
% add_player(Table, Player),
% {ok, [Player]} = gen_server:call(Table, get_player_list).
%remove_player_test() ->
% Table = start_link("123", none),
% Player = test_player,
% Player2 = test_player2,
% add_player(Table, Player),
% {ok, [Player]} = gen_server:call(Table, get_player_list),
% add_player(Table, Player2),
% {ok, [Player2, Player]} = gen_server:call(Table, get_player_list),
% remove_player(Table, Player),
% {ok, [Player2]} = gen_server:call(Table, get_player_list),
% remove_player(Table, Player2),
% {ok, []} = gen_server:call(Table, get_player_list).
%
%stop_test() ->
% Table = start_link("123", none),
% ok = stop(Table).
%
%% @private
%notify_test() ->
% Table = start_link("123", none),
% Player = test_player,
% Message = {server, define, "function helloWorld(x) { }"},
% ok = notify(Table, Player, Message).
%>>>>>>> jonte_rewrite
%Message2 = {game, "helloWorld", "test"},
%ok = notify(Table, Player, Message2).