private ObjectInfo PipFragmentInfo(object context, PipFragment pipFrag) { return(pipFrag.FragmentType == PipFragmentType.StringLiteral ? GetObjectInfo(context, pipFrag.GetStringIdValue()) : pipFrag.FragmentType == PipFragmentType.AbsolutePath ? GetObjectInfo(context, pipFrag.GetPathValue()) : pipFrag.FragmentType == PipFragmentType.NestedFragment ? GetObjectInfo(context, pipFrag.GetNestedFragmentValue()) : new ObjectInfo("{invalid}")); }
private void DoTestRenderer(PathTable pathTable, PipFragmentRenderer renderer, string expectedHash) { // StringId var strValue = "my string"; XAssert.AreEqual(strValue, renderer.Render(PipFragment.FromString(strValue, pathTable.StringTable))); var pathStr = A("t", "file1.txt"); var path = AbsolutePath.Create(pathTable, pathStr); var srcFile = FileArtifact.CreateSourceFile(path); var outFile = FileArtifact.CreateOutputFile(srcFile); var rwFile = outFile.CreateNextWrittenVersion(); var rw2File = rwFile.CreateNextWrittenVersion(); var opaqueDir = DirectoryArtifact.CreateDirectoryArtifactForTesting(path, 0); var sharedDir = new DirectoryArtifact(path, 1, isSharedOpaque: true); // AbsolutePath XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(path))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(srcFile))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(outFile))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(rwFile))); XAssert.AreEqual(pathStr, renderer.Render(PipFragment.FromAbsolutePathForTesting(rw2File))); // VsoHash XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(srcFile))); XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(outFile))); XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(rwFile))); XAssert.AreEqual(expectedHash, renderer.Render(PipFragment.VsoHashFromFileForTesting(rw2File))); XAssert.AreEqual(DirectoryId.ToString(opaqueDir), renderer.Render(PipFragment.DirectoryIdForTesting(opaqueDir))); XAssert.AreEqual(DirectoryId.ToString(sharedDir), renderer.Render(PipFragment.DirectoryIdForTesting(sharedDir))); }
protected static StringId ExtractMonikerValueFromPipData(PipData arguments) { XAssert.AreEqual(1, arguments.FragmentCount, "expected 1 fragment"); PipFragment fragment = arguments.First(); XAssert.AreEqual(PipFragmentType.IpcMoniker, fragment.FragmentType); return(fragment.GetIpcMonikerValue()); }
internal AbsolutePath GetPathValue(PipFragment arg) { Contract.Requires(arg.FragmentType == PipFragmentType.AbsolutePath); var path = arg.GetPathValue(); m_inputs.Remove(path); return(path); }
public void CopiedPipDataFragment() { var pipData = m_pipDataBuilder.ToPipData(EnclosingSeparator, EnclosingEscaping); // Create a pip fragment and verify that fragment var pipFragment = PipFragment.CreateNestedFragment(pipData); XAssert.IsTrue(pipFragment.FragmentType == PipFragmentType.NestedFragment); VerifyFullPipData(pipFragment.GetNestedFragmentValue()); }
public void TestRendererWithoutHashLookup() { var pathTable = new PathTable(); var renderer = new PipFragmentRenderer(pathTable); DoTestRenderer(pathTable, renderer, FileContentInfo.CreateWithUnknownLength(ContentHashingUtilities.ZeroHash).Render()); var moniker = new StringMoniker("123"); XAssert.AreEqual(moniker.Id, renderer.Render(PipFragment.CreateIpcMonikerForTesting(moniker, pathTable.StringTable))); }
public void TestRendererWithHashLookup() { var pathTable = new PathTable(); var fakeContentInfo = FileContentInfo.CreateWithUnknownLength(ContentHash.Random()); var expectedHash = fakeContentInfo.Render(); var renderer = new PipFragmentRenderer(pathTable, (mId) => "XYZ:" + mId, (f) => fakeContentInfo); DoTestRenderer(pathTable, renderer, expectedHash); var moniker = new StringMoniker("123"); XAssert.AreEqual("XYZ:123", renderer.Render(PipFragment.CreateIpcMonikerForTesting(moniker, pathTable.StringTable))); }
internal object GetObjectValue(PipFragment arg) { if (arg.FragmentType == PipFragmentType.StringLiteral) { return(arg.GetStringIdValue().ToString(Context.StringTable)); } if (arg.FragmentType == PipFragmentType.NestedFragment) { return(arg.GetNestedFragmentValue()); } return(GetPathValue(arg)); }
private void VerifyNested1(PipFragment fragment) { PipData nestedData = fragment.GetNestedFragmentValue(); XAssert.AreEqual(NumStandardBlockFragments + 1, nestedData.FragmentCount); using (var nestedEnumerator = nestedData.GetEnumerator()) { var localEnumerator = nestedEnumerator; VerifyStandardBlock(ref localEnumerator); AssertMoveNext(ref localEnumerator, out fragment, PipFragmentType.StringLiteral); XAssert.AreEqual(UniqueEntry1, m_pathTable.StringTable.GetString(fragment.GetStringIdValue())); XAssert.IsFalse(localEnumerator.MoveNext()); } }
private void VerifyNested0(PipFragment fragment) { PipData nestedData = fragment.GetNestedFragmentValue(); XAssert.AreEqual(NumStandardBlockFragments + 1, nestedData.FragmentCount); using (var nestedEnumerator = nestedData.GetEnumerator()) { var localEnumerator = nestedEnumerator; AssertMoveNext(ref localEnumerator, out fragment, PipFragmentType.AbsolutePath); XAssert.AreEqual(m_uniqueEntry0, fragment.GetPathValue()); VerifyStandardBlock(ref localEnumerator); XAssert.IsFalse(localEnumerator.MoveNext()); } }
private IExpression Generate(PipFragment fragment) { switch (fragment.FragmentType) { case PipFragmentType.Invalid: return(Identifier.CreateUndefined()); case PipFragmentType.StringLiteral: return(Generate(fragment.GetStringIdValue())); case PipFragmentType.AbsolutePath: return(Generate(fragment.GetPathValue())); case PipFragmentType.NestedFragment: return(Generate(fragment.GetNestedFragmentValue())); default: throw Contract.AssertFailure($"Unexpected PipFragmentType from PipFragment.FragmentType: {fragment.FragmentType}"); } }
public void PipFragmentEquality() { var pathTable = new PathTable(); StructTester.TestEquality( baseValue: PipFragment.FromString("mystring", pathTable.StringTable), equalValue: PipFragment.FromString("mystring", pathTable.StringTable), notEqualValues: new[] { PipFragment.FromString("MyString", pathTable.StringTable), PipFragment.FromAbsolutePathForTesting( FileArtifact.CreateSourceFile(AbsolutePath.Create(pathTable, A("t", "file1.txt")))), PipFragment.FromAbsolutePathForTesting( FileArtifact.CreateSourceFile(AbsolutePath.Create(pathTable, A("t", "file1.txt"))).CreateNextWrittenVersion()), PipFragment.CreateNestedFragment( PipDataBuilder.CreatePipData(pathTable.StringTable, " ", PipDataFragmentEscaping.CRuntimeArgumentRules)) }, eq: (left, right) => left == right, neq: (left, right) => left != right); }
private static void AssertMoveNext(ref PipData.FragmentEnumerator enumerator, out PipFragment fragment, PipFragmentType?expectedFragmentType = null) { XAssert.IsTrue(enumerator.MoveNext()); fragment = enumerator.Current; XAssert.IsTrue(fragment.IsValid); if (expectedFragmentType.HasValue) { XAssert.AreEqual(expectedFragmentType.Value, fragment.FragmentType); } }
public ObjectInfo GetObjectInfo(object context, object obj) { obj = obj is EvaluationResult evalResult ? evalResult.Value : obj; if (obj == null || IsInvalid(obj)) { return(s_nullObj); } if (obj.GetType().IsArray) { return(ArrayObjInfo(((IEnumerable)obj).Cast <object>().ToArray())); } var customResult = m_customRenderer?.Invoke(this, context, obj); if (customResult != null) { return(customResult); } return(obj switch { ScopeLocals scope => new ObjectInfo(LocalsScopeName, null, Lazy.Create(() => GetLocalsForStackEntry(scope.EvalState, scope.FrameIndex))), ScopePipGraph scope => PipGraphInfo(scope.Graph).WithPreview(PipGraphScopeName), ScopeAllModules scope => ArrayObjInfo(scope.EvaluatedModules.ToArray()).WithPreview(EvaluatedModulesScopeName), IModuleAndContext mc => GetObjectInfo(mc.Tree.RootContext, mc.Module), ObjectInfo objInf => objInf, IPipGraph graph => PipGraphInfo(graph), Pip pip => GenericObjectInfo(pip, $"<{pip.PipType}>").Build(), PipProvenance prov => ProvenanceInfo(prov), EnvironmentVariable envVar => EnvironmentVariableInfo(envVar), PipFragment pipFrag => PipFragmentInfo(context, pipFrag), Thunk thunk => thunk.Value != null?GetObjectInfo(context, thunk.Value) : new ObjectInfo("<not evaluated>"), FunctionLikeExpression lambda => LambdaInfo(lambda), Closure cls => LambdaInfo(cls.Function), SymbolAtom sym => new ObjectInfo(sym.ToString(StringTable)), StringId id => new ObjectInfo(id.ToString(StringTable)), PipId id => new ObjectInfo($"{id.Value}"), UndefinedLiteral _ => new ObjectInfo("undefined", UndefinedLiteral.Instance), UndefinedValue _ => new ObjectInfo("undefined", UndefinedValue.Instance), AbsolutePath path => new ObjectInfo($"p`{path.ToString(PathTable)}`", path), RelativePath path => new ObjectInfo($"r`{path.ToString(StringTable)}`", path), PathAtom atom => new ObjectInfo($"a`{atom.ToString(StringTable)}`", atom), FileArtifact file => new ObjectInfo($"f`{file.Path.ToString(PathTable)}`", file), DirectoryArtifact dir => new ObjectInfo($"d`{dir.Path.ToString(PathTable)}`", dir), int num => new ObjectInfo($"{num}"), uint num => new ObjectInfo($"{num}"), short num => new ObjectInfo($"{num}", (int)num), long num => new ObjectInfo($"{num}"), char ch => new ObjectInfo($"'{ch}'", ch.ToString()), string str => new ObjectInfo($"\"{str}\"", str), Enum e => new ObjectInfo($"{e.GetType().Name}.{e}", e), NumberLiteral numLit => new ObjectInfo(numLit.UnboxedValue.ToString(), numLit), Func <object> func => FuncObjInfo(func), ArraySegment <object> arrSeg => ArrayObjInfo(arrSeg), IEnumerable enu => new ObjectInfoBuilder().Preview("IEnumerable").Prop("Result", Lazy.Create <object>(() => enu.Cast <object>().ToArray())).Build(), ArrayLiteral arrLit => ArrayObjInfo(arrLit.Values.Select(v => v.Value).ToArray()).WithOriginal(arrLit), ModuleBinding binding => GetObjectInfo(context, binding.Body), ErrorValue error => ErrorValueInfo(), object o => GenericObjectInfo(o).Build(), _ => s_nullObj });