main
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using mars.rover.common;
 5using mars.rover.domain;
 6using mars.rover.presentation;
 7using mars.rover.presentation.infrastructure;
 8using mars.rover.presentation.model;
 9using mars.rover.service.application;
10
11namespace mars.rover
12{
13    public class Program : ParameterizedCommand<IEnumerable<CommandLineArgument>>
14    {
15        readonly Presenter presenter;
16
17        public Program(Presenter presenter)
18        {
19            this.presenter = presenter;
20        }
21
22        public void run_against(IEnumerable<CommandLineArgument> item)
23        {
24            presenter.run();
25        }
26
27        static void Main(string[] args)
28        {
29            var nasa = new NASA();
30            var view = new CaptureUserInstructionsConsoleView(Console.In, Console.Out);
31            var program = new Program(
32                new CaptureUserInstructionsPresenter(
33                    view,
34                    new SynchronousCommandPump(new DefaultRegistry<ParameterizedCommand<string>>
35                                        {
36                                            new CreateMarsCommand(nasa),
37                                            new DeployRoverCommand(
38                                                new DefaultRegistry<HeadingFactory>
39                                                    {
40                                                        new HeadingFactory("N", x => new North(x)),
41                                                        new HeadingFactory("E", x => new East(x)),
42                                                        new HeadingFactory("W", x => new West(x)),
43                                                        new HeadingFactory("S", x => new South(x)),
44                                                        new UnknownHeadingFactory(),
45                                                    },
46                                                nasa),
47                                            new NavigateRoverCommand(
48                                                new DefaultRegistry<Navigation>
49                                                    {
50                                                        new Navigation('L', x => x.turn_left()),
51                                                        new Navigation('R', x => x.turn_right()),
52                                                        new Navigation('M', x => x.move_forward()),
53                                                        new UnknownNavigation(),
54                                                    }
55                                                ,
56                                                view, nasa)
57                                        }, new SynchronousCommandProcessor(), new CommandFactory())));
58            program.run_against(args.Select(x => (CommandLineArgument) x));
59        }
60    }
61}