예제 #1
0
        private static void CheckIntegers(List <IntegerData> integers, TypeSet t, Action CheckContents, ref ParameterType modifiedType)
        {
            IntegerData Integer1 = new IntegerData("int1", ParameterType.Parse("e051bfd8-d9d8-4f14-bd39-0ec1a9e9073b"), 456, 123);
            IntegerData Integer2 = new IntegerData("repeat", ParameterType.Parse("4427eb13-e799-4959-86a8-31a2dbd71b03"), 456, 123);
            IntegerData Integer3 = new IntegerData("repeat", ParameterType.Parse("e8aa3cef-8b60-4b08-bb8d-e0a9b2a2085e"), 1, 0);

            var a = Integer1;

            t.AddInteger(a);
            integers.Add(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            a = Integer2;
            t.AddInteger(a);
            integers.Add(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            a = Integer1;
            t.Remove(a.TypeId);
            integers.Remove(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            a = Integer3;
            t.AddInteger(a);
            integers.Add(a);
            Assert.That(modifiedType, Is.EqualTo(a.TypeId));
            modifiedType = null;
            CheckContents();

            IntegerData Integer2Replacement = new IntegerData("Integer2 replacement", ParameterType.Parse("4427eb13-e799-4959-86a8-31a2dbd71b03"), 234, -234);

            t.ModifyInteger(Integer2Replacement);
            integers[integers.IndexOf(Integer2)] = Integer2Replacement;
            Assert.That(modifiedType, Is.EqualTo(Integer2Replacement.TypeId));
            modifiedType = null;
            CheckContents();

            IntegerData Integer3Replacement = new IntegerData("replacement integer 3", ParameterType.Parse("e8aa3cef-8b60-4b08-bb8d-e0a9b2a2085e"), 1, 0);

            t.RenameType(Integer3.TypeId, Integer3Replacement.Name);
            integers[integers.IndexOf(Integer3)] = Integer3Replacement;
            Assert.That(modifiedType, Is.EqualTo(Integer3Replacement.TypeId));
            modifiedType = null;
            CheckContents();
        }
예제 #2
0
        public static TypeSet Make()
        {
            var result = new TypeSet();

            result.AddInteger(BaseTypeInteger.Data);
            result.AddDecimal(BaseTypeDecimal.Data);
            result.AddLocalizedString(BaseTypeLocalizedString.Data);
            result.AddOther(StringParameter.ParameterType, "String", (name, id, def, document) => new StringParameter(name, id, def));
            result.AddOther(BooleanParameter.ParameterType, "Boolean", (name, id, def, document) => new BooleanParameter(name, id, def));
            result.AddOther(AudioParameter.ParameterType, "Audio", (name, id, def, document) => new AudioParameter(name, id));
            return(result);
        }
예제 #3
0
        /// <summary>
        /// Fill the data source from all the data stored in all domain files
        /// </summary>
        /// <param name="domains">All the domain files used to populate the datasource</param>
        public ConversationDataSource(IEnumerable <DomainData> domains)
        {
            domains = domains.Evaluate();

            //Types must be generated before Nodes and can be generated before NodeTypes
            foreach (var domain in domains)
            {
                foreach (var typeData in domain.DynamicEnumerations)
                {
                    m_types.AddDynamicEnum(typeData.TypeID, (name, guid) => typeData.Make(name, guid));
                }

                foreach (var typeData in domain.Enumerations)
                {
                    IEnumeration enumeration = typeData.Make();
                    m_enumerations.Add(enumeration);
                    m_types.AddEnum(enumeration.TypeId, enumeration.Parameter);
                }

                foreach (var typeData in domain.Decimals)
                {
                    m_types.AddDecimal(typeData.TypeID, typeData.Make);
                }

                foreach (var typeData in domain.Integers)
                {
                    m_types.AddInteger(typeData.TypeID, typeData.Make);
                }
            }

            //NodeTypes must be generated before Nodes and can be generated before Types. NodeTypes may have interdependencies between files
            var nodeTypeData = domains.SelectMany(d => d.NodeTypes).ToList();
            var duplicates   = nodeTypeData.GroupBy(a => a.Guid).Where(g => g.Count() > 1);

            if (duplicates.Any())
            {
                throw new Exception("The following node types have duplicate definitions: " + string.Join(", ", duplicates.Select(g => g.Key).ToArray()));
            }
            List <NodeType> nodeTypes = new List <NodeType> {
            };

            nodeTypes.Add(m_nodeHeirarchy);

            //foreach (var data in nodeTypeData.Where(d => d.Parent == DomainGUIDS.CATEGORY_NONE).ToList())
            //{
            //    var newNodeType = new NodeType(data.Name, data.Guid);
            //    m_nodes.m_childTypes.Add(newNodeType);
            //    nodeTypes.Add(newNodeType);
            //    nodeTypeData.Remove(data);
            //}

            bool gotOne = true;

            while (nodeTypeData.Any() && gotOne)
            {
                gotOne = false;
                for (int i = 0; i < nodeTypes.Count; i++)
                {
                    var parent = nodeTypes[i];
                    foreach (var data in nodeTypeData.Where(d => d.Parent == parent.Guid).ToList())
                    {
                        var newNodeType = new NodeType(data.Name, data.Guid);
                        parent.m_childTypes.Add(newNodeType);
                        nodeTypes.Add(newNodeType);
                        gotOne = true;
                        nodeTypeData.Remove(data);
                    }
                }
            }

            if (!gotOne)
            {
                //TODO: How to express this to the user?
                //Do they even need to know? It may just be autoresolved
                //throw new Exception("The following node types are ancestors of an unknown node type: " + string.Join(", ", nodeTypeData.Select(d => d.Guid).ToArray()));
                MessageBox.Show("The following node types are ancestors of an unknown node type: " + string.Join(", ", nodeTypeData.Select(d => d.Guid).ToArray()));
                foreach (var orphan in nodeTypeData)
                {
                    m_nodeHeirarchy.m_childTypes.Add(new NodeType(orphan.Name, orphan.Guid));
                }
            }

            //Connectors must be generated after Types but before Nodes
            Dictionary <ID <TConnectorDefinition>, ConnectorDefinitionData> connectorDefinitions = new Dictionary <ID <TConnectorDefinition>, ConnectorDefinitionData>()
            {
                { SpecialConnectors.Output.Id, SpecialConnectors.Output },
                { SpecialConnectors.Input.Id, SpecialConnectors.Input },
            };

            foreach (var domain in domains)
            {
                foreach (var connector in domain.Connectors)
                {
                    connectorDefinitions[connector.Id] = connector;
                }
            }

            //Nodes must be generated after NodeTypes, Types and Connectors
            foreach (var domain in domains)
            {
                foreach (var node in domain.Nodes)
                {
                    var name = node.Name;
                    var guid = node.Guid;

                    Func <NodeData.ConnectorData, Func <IEditable, Output> > processConnector = c =>
                    {
                        Func <IEditable, List <Parameter>, Output> a = connectorDefinitions[c.TypeID].Make(c.Id, ConversationConnectionRules.Instance);
                        return(data => a(data, c.Parameters));
                    };

                    IEnumerable <Func <IEditable, Output> > connectors = node.Connectors.Select(processConnector).Evaluate();
                    var parameters = node.Parameters.Select <NodeData.ParameterData, Func <Parameter> >(p => () => p.Make(m_types.Make)).Evaluate();
                    var config     = node.Config.ToDictionary(b => b.Name, b => b.Value, StringComparer.OrdinalIgnoreCase);

                    var parent = m_nodeHeirarchy.Collapse(x => x.m_childTypes, x => x.Only()).SingleOrDefault(x => x.Guid == node.Type) ?? m_nodeHeirarchy;

                    var nodeGenerator = new GenericEditableGenerator(name, guid, config, (id, ng) => new ExternalFunction(ng, id, connectors, parameters.Select(b => b()).ToArray()));
                    parent.m_nodes.Add(nodeGenerator);
                    m_nodes[guid] = nodeGenerator;
                }
            }
        }