Exemplo n.º 1
0
        public void TestSolve()
        {
            var ps = new Collection <ProvidedSocket>();

            ps.Add(new ProvidedSocket()
            {
                Types = new Collection <string>()
                {
                    "A"
                }, Label = "ps1"
            });
            ps.Add(new ProvidedSocket()
            {
                Types = new Collection <string>()
                {
                    "B"
                }, Label = "ps2"
            });
            ps.Add(new ProvidedSocket()
            {
                Types = new Collection <string>()
                {
                    "C"
                }, Label = "ps3"
            });
            ps.Add(new ProvidedSocket()
            {
                Types = new Collection <string>()
                {
                    "D"
                }, Label = "ps4"
            });
            ps.Add(new ProvidedSocket()
            {
                Types = new Collection <string>()
                {
                    "O"
                }, Label = "ps5"
            });

            var mbDefs = new List <MainboardDefinition>()
            {
                ModelTest.CreateMainboardDef("happy", ps)
            };

            var moDefs = new List <ModuleDefinition>()
            {
                ModelTest.CreateModuleDef(Guid.Parse("015DF700-5A47-4282-BD91-BFD024D038FC"), "m1su1", "A", false),
                ModelTest.CreateModuleDef(Guid.Parse("9AB4B04B-A31B-4E8C-82E6-532456B8C0A0"), "m2su1", "B,C", false),
                ModelTest.CreateModuleDef(Guid.Parse("3B5F45A2-EE5A-4FE7-83E6-900D7096F0E2"), "m3su1", "B,A", false),
                ModelTest.CreateModuleDef(Guid.Parse("5FE253D2-3B61-4F84-8F4B-8B9B05AEE0AE"), "m4su1", "D", false),
                //ModelTest.CreateModuleDef(Guid.Parse("A5C823F5-88B8-4F33-BE2F-9D1956C9ED9C"),"m5su1","D",true),
                //ModelTest.CreateModuleDef(Guid.Parse("3FF4E16B-2DAD-4B93-BCF3-5FE359F95079"),"m6su1","O",true),
            };


            GadgeteerDefinitionsManager.Instance.Initialize(mbDefs, moDefs);

            var store = new Store(typeof(GadgeteerDSLDomainModel));
            var tx    = store.TransactionManager.BeginTransaction();

            var mainboard = new Mainboard(store);

            mainboard.Name = "happy";
            mainboard.CreateSockets();

            var modules = new Collection <Module>();

            var ids = new Collection <Guid>();

            ids.Add(Guid.Parse("015DF700-5A47-4282-BD91-BFD024D038FC"));
            ids.Add(Guid.Parse("9AB4B04B-A31B-4E8C-82E6-532456B8C0A0"));
            ids.Add(Guid.Parse("3B5F45A2-EE5A-4FE7-83E6-900D7096F0E2"));
            ids.Add(Guid.Parse("5FE253D2-3B61-4F84-8F4B-8B9B05AEE0AE"));
            //ids.Add(Guid.Parse("A5C823F5-88B8-4F33-BE2F-9D1956C9ED9C"));
            //ids.Add(Guid.Parse("3FF4E16B-2DAD-4B93-BCF3-5FE359F95079"));

            foreach (var guid in ids)
            {
                var m = new Module(store)
                {
                    ModuleDefinitionId = guid
                };
                m.CreateSocketUses();
                modules.Add(m);
            }


            //Basic test where all works
            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                var socketUses = from o in modules from su in o.SocketUses select su;
                var b1         = AutoConnect.Solve(mainboard, socketUses);
                Assert.IsTrue(b1, "Complex connection");
                tx2.Rollback();
            }

            // Test where there are mutiple optional sockets with the same type

            /*
             * using (var tx2 = store.TransactionManager.BeginTransaction())
             * {
             *      (GadgeteerDefinitionsManager.Instance.Modules.Last().Sockets[0].Types[0] as SingleSocketType).Value = "D";
             *      var socketUses = from o in modules from su in o.SocketUses select su;
             *      var b1 = AutoConnect.Solve(mainboard, socketUses);
             *      Assert.IsTrue(b1, "Multiple optional sockets with the same type");
             *      Assert.IsNotNull(modules[3].SocketUses[0].Socket);
             *      tx2.Rollback();
             * }
             */

            // Test where an optional socket cannot connect

            /*
             * using (var tx2 = store.TransactionManager.BeginTransaction())
             * {
             *      (GadgeteerDefinitionsManager.Instance.Modules.Last().Sockets[0].Types[0] as SingleSocketType).Value = "Z";
             *      var socketUses = from o in modules from su in o.SocketUses select su;
             *      var b1 = AutoConnect.Solve(mainboard, socketUses);
             *      Assert.IsTrue(b1, "Optional socket cannot connect");
             *      tx2.Rollback();
             * }
             */

            //Start from a partially connected state
            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                modules[0].SocketUses[0].Socket = mainboard.Sockets[0];
                var socketUses = from o in modules from su in o.SocketUses select su;
                var b1         = AutoConnect.Solve(mainboard, socketUses);
                Assert.IsTrue(b1, "Partial connection");
                tx2.Rollback();
            }

            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                (GadgeteerDefinitionsManager.Instance.Modules.First().Sockets[0].Types[0] as SingleSocketType).Value = "E";
                var socketUses = from o in modules from su in o.SocketUses select su;
                var b1         = AutoConnect.Solve(mainboard, socketUses);
                Assert.IsFalse(b1, "A module that cannot connect to the mainboard");
                tx2.Rollback();
            }


            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                (GadgeteerDefinitionsManager.Instance.Modules.First().Sockets[0].Types[0] as SingleSocketType).Value = "A";
                GadgeteerDefinitionsManager.Instance.Mainboards.First().ProvidedSockets.RemoveAt(3);
                mainboard.CreateSockets();
                var socketUses = from o in modules from su in o.SocketUses select su;
                var b1         = AutoConnect.Solve(mainboard, socketUses);
                Assert.IsFalse(b1, "Not enough sockets on the mainboard");
                tx2.Rollback();
            }

            tx.Rollback();
            store.Dispose();
        }
Exemplo n.º 2
0
        public void PinConnectTest()
        {
            var providedSockets = new Collection <ProvidedSocket>()
            {
                new ProvidedSocket()
                {
                    Label = "mb1ps1", SharedPinMaps = new Collection <SharedPinMap>()
                    {
                        new SharedPinMap()
                        {
                            NetId = "spm1", SocketPin = 1
                        },
                        new SharedPinMap()
                        {
                            NetId = "spm2", SocketPin = 2
                        }
                    }
                },
                new ProvidedSocket()
                {
                    Label = "mb1ps2", SharedPinMaps = new Collection <SharedPinMap>()
                    {
                        new SharedPinMap()
                        {
                            NetId = "spm1", SocketPin = 3
                        }
                    }
                },
                new ProvidedSocket()
                {
                    Label = "mb1ps3"
                },
                new ProvidedSocket()
                {
                    Label = "mb1ps4", SharedPinMaps = new Collection <SharedPinMap>()
                    {
                        new SharedPinMap()
                        {
                            NetId = "spm1", SocketPin = 2
                        },
                        new SharedPinMap()
                        {
                            NetId = "spm2", SocketPin = 4
                        }
                    }
                }
            };

            var mbDefs = new List <MainboardDefinition>()
            {
                ModelTest.CreateMainboardDef("happy", providedSockets)
            };

            var moduleGuid = Guid.Parse("015DF700-5A47-4282-BD91-BFD024D038FC");


            var moDefs = new List <ModuleDefinition>()
            {
                ModelTest.CreateModuleDef(moduleGuid, new Collection <Microsoft.Gadgeteer.Designer.Definitions.SocketUse>()
                {
                    ModelTest.CreateSocketUseDef("m1su1", new List <string>()
                    {
                        "A"
                    }, null),
                    ModelTest.CreateSocketUseDef("m1su2", new List <string>()
                    {
                        "A"
                    }, null),
                    ModelTest.CreateSocketUseDef("m1su3", new List <string>()
                    {
                        "A"
                    }, null),
                    ModelTest.CreateSocketUseDef("m1su4", new List <string>()
                    {
                        "A"
                    }, null)
                })
            };

            //This connects to provided socket 0, which has the shared pin on socket pin 1
            moDefs[0].Sockets[0].Pins = new Collection <Pin>()
            {
                new Pin()
                {
                    Shared = true, Value = 1
                },                                                   //This pin uses the mainboard shared pin
                new Pin()
                {
                    Shared = true, Value = 2
                },
                new Pin()
                {
                    Shared = false, Value = 3
                },
                new Pin()
                {
                    Shared = false, Value = 4
                }
            };

            //These next three connect to other provided sockets
            moDefs[0].Sockets[1].Pins = new Collection <Pin>()
            {
                new Pin()
                {
                    Shared = false, Value = 1
                },
                new Pin()
                {
                    Shared = true, Value = 2
                },
                //new Pin() { Shared = false, Value=3},	 //Don't use 3 to test a socket that doesn't use the shared pin
                new Pin()
                {
                    Shared = false, Value = 4
                }
            };

            moDefs[0].Sockets[2].Pins = new Collection <Pin>()
            {
                new Pin()
                {
                    Shared = false, Value = 1
                },
                new Pin()
                {
                    Shared = true, Value = 2
                },
                new Pin()
                {
                    Shared = false, Value = 3
                },
                new Pin()
                {
                    Shared = true, Value = 4
                }
            };

            moDefs[0].Sockets[3].Pins = new Collection <Pin>()
            {
                new Pin()
                {
                    Shared = false, Value = 1
                },
                new Pin()
                {
                    Shared = false, Value = 2
                },
                new Pin()
                {
                    Shared = true, Value = 3
                },
                new Pin()
                {
                    Shared = false, Value = 4
                }
            };
            GadgeteerDefinitionsManager.Instance.Initialize(mbDefs, moDefs);

            var store = new Store(typeof(GadgeteerDSLDomainModel));
            var tx    = store.TransactionManager.BeginTransaction();

            var mainboard = new Mainboard(store);

            mainboard.Name = "happy";
            mainboard.CreateSockets();

            var module = new Module(store);

            module.ModuleDefinitionId = moduleGuid;
            module.CreateSocketUses();

            Func <bool> testConnect = () => Microsoft.Gadgeteer.Designer.SocketUse.CanPinsConnect(mainboard.Sockets[0], module.SocketUses[0]);

            Assert.IsTrue(testConnect(), "No other sockets connected");

            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                mainboard.Sockets[2].SocketUse = module.SocketUses[1];
                Assert.IsTrue(testConnect(), "Sockets connected but no pin conflict");
                tx2.Rollback();
            }

            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                mainboard.Sockets[1].SocketUse = module.SocketUses[2];
                Assert.IsFalse(testConnect(), "Sockets connected and a pin conflict");
                tx2.Rollback();
            }

            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                mainboard.Sockets[1].SocketUse = module.SocketUses[3];
                Assert.IsTrue(testConnect(), "Sockets connected and a pin conflict but is shareable");
                tx2.Rollback();
            }

            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                mainboard.Sockets[3].SocketUse = module.SocketUses[1];
                Assert.IsFalse(testConnect(), "Sockets connected and pins conflict but are not shareable");
                tx2.Rollback();
            }

            using (var tx2 = store.TransactionManager.BeginTransaction())
            {
                mainboard.Sockets[3].SocketUse = module.SocketUses[2];
                Assert.IsTrue(testConnect(), "Sockets connected and pins conflict but and are shareable");
                tx2.Rollback();
            }



            tx.Rollback();
            tx.Dispose();
            store.Dispose();



            //var whee = Microsoft.Gadgeteer.Designer.SocketUse.PinConnect(providedSockets[0], socketUse, providedSockets);
        }