UNPKG

siesta-lite

Version:

Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers

149 lines (103 loc) 5.48 kB
/* Siesta 5.6.1 Copyright(c) 2009-2022 Bryntum AB https://bryntum.com/contact https://bryntum.com/products/siesta/license */ Class('Ariadne.QueryFinder.Edge', { does : Siesta.Util.Role.HasUniqueGeneratedId, has : { finder : { required : true }, maze : { required : true }, fromNode : { required : true }, toNode : { required : true }, // Array of { variant : segments, hash : hash, indicies : Object } segmentVariants : Joose.I.Array, segmentVariantsHashes : Joose.I.Object, isDirectChild : false, weight : Infinity }, methods : { register : function () { var fromNode = this.fromNode var toNode = this.toNode if (fromNode.edgesToByIndex[ toNode.index ]) throw new Error("Edge already exists") if (toNode.edgesFromByIndex[ fromNode.index ]) throw new Error("Edge already exists") fromNode.edgesToByIndex[ toNode.index ] = this toNode.edgesFromByIndex[ fromNode.index ] = this }, consumeVariant : function (segments, segmentsCombInfo) { // TUNE // FOUNDEDGECOUNTER = window.FOUNDEDGECOUNTER || 0 // FOUNDEDGECOUNTER++ if (arguments.length == 1) { segmentsCombInfo = this.finder.combineSegments(segments) } var weight = segmentsCombInfo.weight var hash = segmentsCombInfo.hash if (this.weight > weight) { // if (this.weight < Infinity) console.log("REDEFINED: " + this.segmentVariants.length) this.weight = weight this.segmentVariants = [] this.segmentVariantsHashes = {} } // if (this.segmentVariantsHashes[ hash ]) { // console.log("REPEATED") // } if (this.weight == weight && !this.segmentVariantsHashes[ hash ]) { // TUNE // console.log("Found edge from: " + this. fromNode.index + "[" + this.fromNode.el.tagName + "] to " + this.toNode.index + "[" + this.toNode.el.tagName + "] query: " + segmentsCombInfo.query) // TUNE // FOUNDEDGECOUNTER = window.FOUNDEDGECOUNTER || 0 // FOUNDEDGECOUNTER++ var indicies = {} // should collect all indicies (in the "combineSegments"?) indicies[ segments[ 0 ].index ] = true this.segmentVariantsHashes[ hash ] = true this.segmentVariants.push({ variant : segments, hash : hash, indicies : indicies }) // indicates that something has changed return true } }, relax : function () { var fromNode = this.fromNode var toNode = this.toNode if (fromNode.isReachedWithDirectChildEdge()) { var index = fromNode.index var segmentVariants = this.segmentVariants var hasVariantWithOwnSegments = false for (var i = 0; i < segmentVariants.length; i++) { if (segmentVariants[ i ].indicies[ index ]) { hasVariantWithOwnSegments = true break } } if (!hasVariantWithOwnSegments) return false } var possibleWeight = this.weight + fromNode.weightOptions[ 0 ].weight var existingWeightOption = toNode.weightOptionsByWeight[ possibleWeight ] if (existingWeightOption && !existingWeightOption.minFromEdgesById[ this.id ]) { existingWeightOption.minFromEdgesById[ this.id ] = this return true } if (!existingWeightOption) { var minFromEdgesById = {} minFromEdgesById[ this.id ] = this var weightOption = { weight : possibleWeight, minFromEdgesById : minFromEdgesById } toNode.weightOptionsByWeight[ possibleWeight ] = weightOption var weightOptions = toNode.weightOptions for (var i = 0; i < weightOptions.length; i++) { if (possibleWeight < weightOptions[ i ].weight) { weightOptions.splice(i, 0, weightOption) return true } } weightOptions.push(weightOption) return true } } } });