static Model CreateModelContext(XmlNode xn, Context con)
		{ // check select and path attributes
			Model model = new Model();
			model.Select = XmlFiler.getAttribute(xn, "select");
			Logger.getOnly().isTrue(model.Select != null, "Model instruction must have a select attribute.");
			Logger.getOnly().isTrue(model.Select != "", "Model instruction must have a non-empty select.");
			model.When = XmlFiler.getAttribute(xn, "when");
			model.OnPass = XmlFiler.getAttribute(xn, "on-pass");
			model.OnFail = XmlFiler.getAttribute(xn, "on-fail");
			string rest = XmlFiler.getAttribute(xn, "wait");
			if (rest != null) model.Rest = Convert.ToInt32(rest);
			AddInstruction(xn, model, con);
			return model;
		}
Exemple #2
0
		/// <summary>
		/// Execute this model node context, specified by @select and
		/// creating and executing child instructions.
		/// </summary>
		public override void Execute()
		{
			base.Execute();
			if (m_created)
			{
				Finished = true; // tell do-once it's done
				return; // all has been done in the base Context.Execute().
			}
			Context con = (Context)Ancestor(typeof(Context));
			isNotNull(con, makeNameTag() + " must occur in some context");
			AccessibilityHelper ah = con.Accessibility;
			isNotNull(ah, makeNameTag() + " context is not accessible");

			// If there is a @select, select the nodes
			if (m_select != null && m_select != "")
			{ // each node or attribute selected creates a context
				m_log.paragraph(makeNameTag() + " creating selection targets via " + m_select);
				XmlNodeList pathNodes = XmlInstructionBuilder.selectNodes(con, m_select, makeNameTag());
				isNotNull(pathNodes, makeNameTag() + " select='" + m_select + "' returned no model nodes");
				// The select text may have selected a string that is itself xPath!
				// If so, select on that xPath
				if (pathNodes.Count == 1 && pathNodes.Item(0).NodeType == XmlNodeType.Text)
				{ // this text node should be an xpath statement
					string xPath = pathNodes.Item(0).Value;
					m_log.paragraph(makeNameTag() + " selected a text node with more XPATH: " + xPath);
					pathNodes = XmlInstructionBuilder.selectNodes(con, xPath, makeNameTag() + " selecting " + xPath);
					isNotNull(pathNodes, makeNameTag() + " selecting " + xPath + " from select='" + m_select + "' returned no model nodes");
				}
				// Create a list of paths to loop over
				Model lastModel = this; // use as an insert reference node
				foreach (XmlNode node in pathNodes)
				{ // build the path via each model node
					XmlPath xPath = new XmlPath(node);
					// xPath may be invalid - it means it has no guiPath
					//if (!xPath.isValid()) fail(makeNameTag() + " XmlPath not constructable from " + node.OuterXml);
					if (1 == m_logLevel)
					{
						m_log.paragraph(makeNameTag() + " appPath " + xPath.xPath());
						m_log.paragraph(makeNameTag() + " guiPath " + xPath.Path);
					}
					Model model = new Model();
					model.m_created = true;
					model.m_modelNode = xPath;
					model.m_path = xPath.Path;
					model.m_select = xPath.xPath();
					model.m_when = m_when;
					model.m_name = XmlFiler.getAttribute(node, "name");
					model.m_role = XmlFiler.getAttribute(node, "role");
					model.m_nodeName = node.Name;
					model.Number = TestState.getOnly().IncInstructionCount;
					model.Id += (model.Number - Number).ToString();
					model.Parent = con;
					con.Add(lastModel, model);
					lastModel = model; // insert the next one after this one.
					m_log.mark(model); // log the progress of interpretation
					// if there is content, add instructions to the new model context
					if (m_elt.HasChildNodes)
					{
						foreach (XmlNode xnChild in m_elt.ChildNodes)
						{ // a side-effect of MakeShell is to add the instruction to the model
							XmlInstructionBuilder.MakeShell(xnChild, model);
						}
					}
				}
			}
			Finished = true; // tell do-once it's done
		}