Files
UnrealEngine/Engine/Source/Programs/Shared/EpicGames.BuildGraph.Tests/GraphTests.cs
2025-05-18 13:04:45 +08:00

140 lines
5.1 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EpicGames.BuildGraph.Expressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace EpicGames.BuildGraph.Tests
{
[TestClass]
public class GraphTests
{
static Task UpdateVersionFiles() => Task.CompletedTask;
static Task CompileShooterGameWin64() => Task.CompletedTask;
static Task CookShooterGameWin64() => Task.CompletedTask;
static object Evaluate(BgExpr expr)
{
(byte[] data, BgThunkDef[] methods) = BgCompiler.Compile(expr);
BgInterpreter interpreter = new BgInterpreter(data, methods, new Dictionary<string, string>());
return interpreter.Evaluate();
}
[TestMethod]
public void NodeTest()
{
BgAgent agent = new BgAgent("name", "type");
BgNode nodeSpec1 = agent.AddNode(x => UpdateVersionFiles());
BgNode nodeSpec2 = agent.AddNode(x => CompileShooterGameWin64()).Requires(nodeSpec1);
BgNode nodeSpec3 = agent.AddNode(x => CookShooterGameWin64()).Requires(BgList<BgFileSet>.Create(nodeSpec2.DefaultOutput));
BgNodeDef node3 = ((BgObjectDef)Evaluate(nodeSpec3)).Deserialize<BgNodeExpressionDef>();
Assert.AreEqual(node3.Name, "Cook Shooter Game Win64");
Assert.AreEqual(2, node3.InputDependencies.Count);
Assert.AreEqual(1, node3.Inputs.Count);
BgNodeDef node2 = node3.Inputs[0].ProducingNode;
Assert.AreEqual(node2.Name, "Compile Shooter Game Win64");
Assert.AreEqual(1, node2.InputDependencies.Count);
Assert.AreEqual(1, node2.Inputs.Count);
BgNodeDef node1 = node2.Inputs[0].ProducingNode;
Assert.AreEqual(node1.Name, "Update Version Files");
Assert.AreEqual(0, node1.InputDependencies.Count);
Assert.AreEqual(0, node1.Inputs.Count);
}
[TestMethod]
public void AgentTest()
{
BgAgent expr = new BgAgent("TestAgent", BgList<BgString>.Create("win64", "incremental"));
BgAgentDef agent = ((BgObjectDef)Evaluate(expr)).Deserialize<BgAgentDef>();
Assert.AreEqual("TestAgent", agent.Name);
Assert.AreEqual(2, agent.PossibleTypes.Count);
Assert.AreEqual("win64", agent.PossibleTypes[0]);
Assert.AreEqual("incremental", agent.PossibleTypes[1]);
/*
Assert.AreEqual(1, agent.Nodes.Count);
BgNode node = agent.Nodes[0];
Assert.AreEqual("Update Version Files", node.Name);
*/
}
[TestMethod]
public void AggregateTest()
{
BgAgent agent = new BgAgent("test", "test");
BgNode nodeSpec1 = agent.AddNode(x => UpdateVersionFiles());
BgNode nodeSpec2 = agent.AddNode(x => CompileShooterGameWin64());
BgLabel labelSpec = new BgLabel("name", "category");
BgAggregate aggregateSpec = new BgAggregate("All nodes", BgList.Create(nodeSpec1, nodeSpec2), labelSpec);
BgAggregateExpressionDef aggregateExpr = ((BgObjectDef)Evaluate(aggregateSpec)).Deserialize<BgAggregateExpressionDef>();
BgAggregateDef aggregate = aggregateExpr.ToAggregateDef();
Assert.AreEqual("All nodes", aggregate.Name);
BgNodeDef node1 = aggregate.RequiredNodes.OrderBy(x => x.Name).ElementAt(0);
Assert.AreEqual("Compile Shooter Game Win64", node1.Name);
BgNodeDef node2 = aggregate.RequiredNodes.OrderBy(x => x.Name).ElementAt(1);
Assert.AreEqual("Update Version Files", node2.Name);
BgLabelDef? label = aggregateExpr.Label;
Assert.IsNotNull(label);
Assert.AreEqual(label!.DashboardName, "name");
Assert.AreEqual(label!.DashboardCategory, "category");
}
[TestMethod]
public void LabelTest()
{
BgLabel labelSpec = new BgLabel("name", "category", "ugsBadge", "ugsProject", BgLabelChange.Code);
BgLabelDef label = ((BgObjectDef)Evaluate(labelSpec)).Deserialize<BgLabelDef>();
Assert.AreEqual("name", label.DashboardName);
Assert.AreEqual("category", label.DashboardCategory);
Assert.AreEqual("ugsBadge", label.UgsBadge);
Assert.AreEqual("ugsProject", label.UgsProject);
Assert.AreEqual(BgLabelChange.Code, label.Change);
}
[TestMethod]
public void GraphTest()
{
BgAgent agent = new BgAgent("test", "test");
BgNode nodeSpec1 = agent.AddNode(x => UpdateVersionFiles());
BgNode nodeSpec2 = agent.AddNode(x => CompileShooterGameWin64());
BgAggregate aggregateSpec = new BgAggregate("All nodes", BgList.Create(nodeSpec1, nodeSpec2), new BgLabel("name", "category"));
BgGraph graphSpec = new BgGraph(BgList.Create(nodeSpec1, nodeSpec2), BgList.Create(aggregateSpec));
BgGraphDef graph = ((BgObjectDef)Evaluate(graphSpec)).Deserialize<BgGraphExpressionDef>().ToGraphDef();
Assert.AreEqual(2, graph.NameToNode.Count);
Assert.AreEqual(1, graph.NameToAggregate.Count);
Assert.AreEqual(1, graph.Labels.Count);
BgNodeDef node1 = graph.NameToNode["Update Version Files"];
BgNodeDef node2 = graph.NameToNode["Compile Shooter Game Win64"];
BgLabelDef label = graph.Labels[0];
Assert.AreEqual(label!.DashboardName, "name");
Assert.AreEqual(label!.DashboardCategory, "category");
Assert.IsTrue(label!.RequiredNodes.Contains(node1));
Assert.IsTrue(label!.RequiredNodes.Contains(node2));
Assert.IsTrue(label!.IncludedNodes.Contains(node1));
Assert.IsTrue(label!.IncludedNodes.Contains(node2));
}
}
}